poj3268---spfa

来源:互联网 发布:云计算的前景 编辑:程序博客网 时间:2024/04/30 12:44

最短路径。。。。

由于点比较多1000,,如果dijstra算法 o(n^2)肯定超时,这里用spfa算法。

由于1000点,没有用邻接表,内存略大。

 

算法很简单,还是正向建图,逆向建图,分别求出起点到其他点的最短距离,然后求和,就是从这点出发,然后再回来的的最短距离,最后求出最大值即可。

代码:

#include<stdio.h>#define maxN 1001#define inf 100000000int n, x, m;int mat[maxN][maxN];//正向图邻接矩阵bool flag[maxN][maxN];//正向图标志矩阵int re_mat[maxN][maxN];//逆向图邻接矩阵bool re_flag[maxN][maxN];//逆向图标示矩阵int dis[maxN];//起点到其他点的最短路径int disRes[maxN];//往返最短路径和bool vis[maxN];//标示那个点在队列中int queue[10 * maxN];//spfa队列//邻接矩阵初始化void Init(){for (int i = 1; i <= n; ++ i){for (int j = 1; j <= n; ++ j){mat[i][j] = inf;flag[i][j] = false;re_mat[i][j] = inf;re_flag[i][j] = false;}disRes[i] = 0;}}//spfa算法void spfa(int mat[][maxN], bool flag[][maxN]){for (int i = 1; i <= n; ++ i){vis[i] = false;dis[i] = inf;//disRes[i] = 0;}int head = 0,tail = 1;dis[x] = 0;queue[0] = x;while (head < tail){int u = queue[head];vis[u] = true;for (int i = 1; i <= n; ++ i){if (flag[u][i] && dis[i] > dis[u] + mat[u][i]){dis[i] = dis[u] + mat[u][i];if (!vis[i]){vis[i] = true;queue[tail] = i;tail ++;}}}vis[u] = false;head ++;}for (int i = 1; i <= n; ++ i){disRes[i] += dis[i];}}int main(){while (scanf("%d%d%d", &n, &m, &x) != EOF){int a, b, c;int mMax = -1;Init();for (int i = 0; i < m; ++ i){scanf("%d%d%d", &a, &b, &c);mat[a][b] = c;flag[a][b] = true;re_mat[b][a] = c;re_flag[b][a] = true;}spfa(mat, flag);spfa(re_mat, re_flag);for (int i = 1; i <= n; ++ i){if (mMax < disRes[i]){mMax = disRes[i];}}printf("%d\n", mMax);}return 0;}

原创粉丝点击