Loading

Silver Cow Party POJ - 3268 (固定起点和固定终点的最短路)

 

思路:有向图。假设在X牧场参加party,从X回家的时候,以X为起点,使用一次Dijkstra算法即可。难点在于去X参加party的最短路如何求解。

   这时候我们可以反向建图,即把原来有向图的方向全部反向,形成一幅新的有向图G',此时再对G'使用一次以X为起点的Dijkstra算法即

      可求得原图G中其他各点以X为终点的最短路径。

 

 1 #include<iostream>
 2 #include<vector>
 3 #include<string>
 4 #include<cmath>
 5 #include<set>
 6 #include<algorithm>
 7 #include<cstdio>
 8 #include<map>
 9 #include<cstring>
10 
11 #define INF 1000000000
12 
13 using namespace std;
14 
15 int dis1[1010];        // 正向最短路 (回家的最短路)
16 int dis2[1010];        // 反向最短路 (去party的最短路)
17 int vis[1010];
18 int g1[1010][1010];    // 正向建图 
19 int g2[1010][1010];    // 反向建图 
20 int N, M, X;
21 
22 void dijkstra(int start, int dis[], int g[1010][1010])
23 {
24     for(int i = 1; i <= N; ++i)
25     {
26         dis[i] = INF;
27         vis[i] = 0;
28     }
29     
30     dis[start] = 0;
31     while(1)
32     {
33         int mark = -1, minDis = INF;
34         for(int i = 1; i <= N; ++i)
35         {
36             if(!vis[i] && dis[i] < minDis)
37             {
38                 minDis = dis[i];
39                 mark = i;
40             }
41         }
42         if(mark == -1)
43             break;
44         vis[mark] = 1;
45         for(int i = 1; i <= N; ++i)
46         {
47             if(!vis[i])
48                 dis[i] = min(dis[i], dis[mark]+g[mark][i]);
49         }    
50             
51     }
52     
53     
54     
55 } 
56 
57 int main()
58 {
59     scanf("%d %d %d", &N, &M, &X);
60     for(int i = 1; i <= N; ++i)
61     {
62         for(int j = 1; j <= N; ++j)
63         {
64             if(i == j)
65                 g1[i][j] = g2[i][j] = 0;
66             else
67                 g1[i][j] = g2[i][j] = INF;
68         }
69     }
70     for(int i = 1; i <= M; ++i)
71     {
72         int a, b, cost;
73         scanf("%d %d %d", &a, &b, &cost);
74         g1[a][b] = cost;
75         g2[b][a] = cost;
76     }
77     
78     dijkstra(X, dis1, g1);
79     dijkstra(X, dis2, g2);
80     
81     
82     int ans = -1;
83     
84     for(int i = 1; i <= N; ++i)
85     {
86         if(dis1[i] + dis2[i] > ans)
87             ans = dis1[i] + dis2[i];
88     }
89     
90     printf("%d\n", ans);
91     
92     return 0;
93 }

 

posted @ 2019-08-24 17:22  拾月凄辰  阅读(309)  评论(0编辑  收藏  举报