POJ 3268 Silver Cow Party

题意:

         有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
", MAX);
49     }
50 }
原文地址:https://www.cnblogs.com/corvey/p/4780353.html