POJ 1502 MPI Maelstrom( Spfa, Floyd, Dijkstra)
题目大意:
给你 1到n , n个计算机进行数据传输, 问从1为起点传输到所有点的最短时间是多少, 其实就是算 1 到所有点的时间中最长的那个点。
然后是数据
给你一个n 代表有n个点, 然后给你一个邻接矩阵, 只有一半,另一半自己补
下面是练习的代码。 分别用了Floyd 和 Dijkstra 还有 Spfa(邻接矩阵版)
#include <iostream> #include <cmath> #include <cstring> #include <cstdlib> #include <cstdio> #include <algorithm> #include <vector> #include <queue> using namespace std; #define INF 0xfffffff #define maxn 1006 #define min(a,b) (a<b?a:b) #define max(a,b) (a>b?a:b) int n; int maps[maxn][maxn], dist[maxn]; bool vis[maxn]; int Dijkstra() { dist[1] = 0; for(int i=1; i<=n; i++) { int index, Min = INF; for(int j=1; j<=n; j++) { if(!vis[j] && Min > dist[j]) index = j, Min = dist[j]; } vis[index] = true; for(int j=1; j<=n; j++) { if( !vis[j] ) dist[j] = min(dist[j], dist[index] + maps[index][j]); } } int Max = 0; for(int i=2; i<=n; i++) Max = max(Max, dist[i]); return Max; } void ReadMaps() { char str[30]; memset(vis,false,sizeof(vis)); for(int i=1; i<=n; i++) { dist[i] = INF; maps[i][i] = 0; for(int j=1; j<i; j++) { scanf("%s", str); if(strcmp(str,"x") == 0) maps[i][j] = INF; else sscanf(str,"%d", &maps[i][j]); maps[j][i] = maps[i][j]; } } } int main() { while(cin >> n) { ReadMaps(); int ans = Dijkstra(); cout << ans << endl; } return 0; }
#include <iostream> #include <cmath> #include <cstring> #include <cstdlib> #include <cstdio> #include <algorithm> #include <vector> #include <queue> using namespace std; #define INF 0xfffffff #define maxn 120 int G[maxn][maxn]; int n; void Floyd(); void Slove(); void Init(); int main() { char str[50]; int a; while(cin>> n) { Init(); for(int i=2; i<=n; i++) { for(int j=1; j<i; j++) { scanf("%s", str); if(str[0] == 'x') a = INF; else sscanf(str,"%d", &a); G[i][j] = G[j][i] = a; } } Slove(); } return 0; } void Floyd() { for(int k=1; k<=n; k++) { for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { G[i][j] = min(G[i][j],G[i][k] + G[k][j]); } } } } void Slove() { Floyd(); int Max = 0; for(int i=1; i<=n; i++) { Max = max(Max, G[1][i]); } cout << Max << endl; } void Init() { for(int i=1; i<=n; i++) { for(int j=1; j<i; j++) G[i][j] = G[j][i] = INF; G[i][i] = 0; } }
#include <iostream> #include <cmath> #include <cstring> #include <cstdlib> #include <cstdio> #include <algorithm> #include <vector> #include <queue> using namespace std; #define INF 0xfffffff #define maxn 120 int G[maxn][maxn]; int n, dist[maxn], vis[maxn]; void Spaf(); void Slove(); void Init(); int main() { char str[50]; int a; while(cin>> n) { Init(); for(int i=2; i<=n; i++) { for(int j=1; j<i; j++) { scanf("%s", str); if(str[0] == 'x') a = INF; else sscanf(str,"%d", &a); G[i][j] = G[j][i] = a; } } Slove(); } return 0; } void Spfa() { int p; queue<int> Q; Q.push(1); dist[1] = 0; while( !Q.empty() ) { p = Q.front(); Q.pop(); vis[p] = false; for(int i=1; i<=n; i++) { if(dist[i] > dist[p] + G[p][i]) { dist[i] = dist[p] + G[p][i]; if( !vis[i] ) { Q.push(i); vis[i] = true; } } } } } void Slove() { Spfa(); int Max = 0; for(int i=1; i<=n; i++) { Max = max(Max, dist[i]); } cout << Max << endl; } void Init() { for(int i=1; i<=n; i++) { dist[i] = INF, vis[i] = false; for(int j=1; j<i; j++) G[i][j] = G[j][i] = INF; G[i][i] = 0; } }