标签:
题意:
有N头牛要去X牛的家开party,求这些牛当中来回所需要花的最大时间。
思路:
先以X牛为源点进行一次Dijkstra算法,得出各头牛回家所需花费的时间;再把图反向(即矩阵转置),再以X牛为源点进行一次Dijkstra算法,得出各头牛去X牛的家所需花费的时间。两个时间相加对比得出结果。
1 #include <cstdio> 2 #include <string.h> 3 const int N = 1100, INF = 0x3f3f3f3f; 4 int edge[N][N]; 5 void Dijkstra(int* D, int n, int from) 6 { 7 int mintag; 8 bool vis[N] = {0}; 9 vis[from] = true; 10 memcpy(D, edge[from], 4*N);// 这里不能用sizeof(D), 因为sizeof是在编译时进行,而编译时并不知道D的大小 11 for(int i=1; i<n; ++i) 12 { 13 mintag = from; 14 for(int j=1; j<=n; ++j) 15 if(!vis[j] && D[j] < D[mintag]) 16 mintag = j; 17 vis[mintag] = true; 18 for(int j=1; j<=n; ++j) 19 if(!vis[j] && D[mintag] + edge[mintag][j] < D[j]) 20 D[j] = D[mintag] + edge[mintag][j]; 21 } 22 } 23 int main(void) 24 { 25 int Come[N], Back[N]; 26 int n, m, x, from, to, d, MAX; 27 while(~scanf("%d %d %d", &n, &m, &x)) 28 { 29 memset(edge, INF, sizeof(edge)); 30 for(int i=0; i<m; ++i) 31 { 32 scanf("%d %d %d", &from, &to, &d); 33 if(d < edge[from][to]) 34 edge[from][to] = d; 35 } 36 Dijkstra(Back, n, x); 37 for(int i=1; i<=n; ++i) //生成反向图 38 for(int j=i+1; j<=n; ++j) 39 edge[i][j] ^= edge[j][i], edge[j][i] ^= edge[i][j], edge[i][j] ^= edge[j][i]; 40 Dijkstra(Come, n, x); 41 MAX = 0; 42 for(int i=1; i<=n; ++i) 43 { 44 d = Come[i] + Back[i]; 45 if(d < INF && d > MAX) 46 MAX = d; 47 } 48 printf("%d\n", MAX); 49 } 50 }
标签:
原文地址:http://www.cnblogs.com/gwtan/p/4780353.html