主要涉及链式前向星,dijkstra算法,Floyd算法,及其相应摸版。
目录
第一题:查找文献
思路:
代码:
第二题:Floyd
思路:
代码:
第三题:单源最短路径
思路:
代码:
第一题:查找文献
P5318 【深基18.例3】查找文献 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
思路:
这个主要考察单边遍历问题,涉及到BFS和DFS的利用,可以采用vector存图来简化空间复杂度,同时注意记得排序。
代码:
#include<bits/stdc++.h>
using namespace std;
const int M = 1e6 + 5;
vector< int >f[M];
queue<int>Q;
bool vis[M];//全局变量一开始全部为0
void dfs(int x)
{
cout << x << " ";
for (int i = 0; i < f[x].size(); i++)
{
int next = f[x][i];
if (!vis[next])
{
vis[next] = true;
dfs(next);
}
}
}
int main()
{
int n, m;
cin >> n >> m;
for (int i = 0; i < m; i++)
{
int x, y;
cin >> x >> y;
f[x].push_back(y);
}
for (int i = 0; i < m; i++)
{
sort(f[i].begin(), f[i].end());
}
vis[1] = 1;
dfs(1);
cout << endl;
memset(vis, 0, sizeof(vis));//重新初始化
Q.push(1); vis[1] = 1;//bfs
while (!Q.empty())
{
int X = Q.front(); Q.pop();
cout << X << " ";
for (int i = 0; i < f[X].size(); i++)
{
int next = f[X][i];
if (!vis[next])
{
vis[next]=1;
Q.push(next);
}
}
}
return 0;
}
第二题:Floyd
U80592 【模板】floyd - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
思路:
这就是一道简单的模板题,可以采用滚动数组优化一下空间复杂度,如果理解不了就记模板就可以了。
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll INF = 1e9 + 10, MOD = 998244354,M=505;
ll f[M][M];
int main()
{
int n, m;
cin >> n >> m;
/*memset(f, INF, sizeof(f));不建议使用,其实和遍历时间复杂度一样*/
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++) {
if (i == j)f[i][j] == 0;
else
{
f[i][j] = INF;//赋初值
}
}
}
for (int i = 1; i <= m; i++)
{
ll x, y, l;
cin >> x >> y >> l;
f[x][y] = min(l,f[x][y]);
f[y][x] = min(l, f[y][x]);//有重复的路径但是路程不同取最短路程
}
for (int k = 1; k <= n; k++)
{
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= n; j++)
{
f[i][j] = min(f[i][j], f[i][k] + f[k][j]);
}
}
}
for (int i = 1; i <= n; i++) {
ll sum = 0;
for (int j = 1; j <= n; j++) {
sum = (sum + f[i][j]) % MOD;
}
cout << sum << endl;
}
return 0;
}
第三题:单源最短路径
P4779 【模板】单源最短路径(标准版) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
思路:
主要考察链式前向星和Dijkstra的模板,没有什么难度文章来源:https://www.toymoban.com/news/detail-636069.html
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 50, INF = 1e9 + 1000,maxm=5e5+50;
struct edge
{
int next;//同一个起点的上一个点
int to;//终点
int dis;//权值
};
edge e[maxm];
int ans[maxn];
bool vis[maxn];
int head[maxn],tot;
inline void add_edge(int st, int ed, int dis)//链式前向星的模板
{
e[++tot].dis = dis;
e[tot].to = ed;
e[tot].next = head[st];
head[st] = tot;
}
struct node
{
int now;
int dis;
bool operator < (const node& x)const
{
return x.dis < dis;
}
};
priority_queue<node>Q;//由小到大
int main()
{
int n, m, s;
cin >> n >> m >> s;
for (int i = 1; i <= n; i++)ans[i] = INF;
ans[s] = 0;
for (int i = 0; i < m; i++)
{
int u, v, w;
cin >> u >> v >> w;
add_edge(u, v, w);
}
Q.push({ s,0 });
while (!Q.empty())//dijkstra模板
{
auto X = Q.top();
Q.pop();
int now = X.now;
if (vis[now])continue;
vis[now] = 1;
for (int i = head[now]; i; i = e[i].next)//链式前向星遍历模板
{
int Y = e[i].to;
if (ans[Y] > ans[now] + e[i].dis)
{
ans[Y] = ans[now] + e[i].dis;
if (!vis[Y])
{
Q.push({ Y, ans[Y] });
}
}
}
}
for (int i = 1; i <= n; i++)
{
cout << ans[i] << " ";
}
return 0;
}
文章来源地址https://www.toymoban.com/news/detail-636069.html
到了这里,关于第九周:图论的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!