POJ 3268 Silver Cow Party
Posted Lorazepam
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ 3268 Silver Cow Party相关的知识,希望对你有一定的参考价值。
http://poj.org/problem?id=3268
有一个点X开party 求其他所有点 去的路程和返程的和的最小值中的最大值
这里有一个小技巧
总是把X当做原点
返程是正常的最短路
去程就把路径翻转 求最短路
这样只需要两次求最短路
1 #include <iostream> 2 #include <stdio.h> 3 #include <string.h> 4 #include <queue> 5 #include <algorithm> 6 #define MAXV 1007 7 #define MAXE 100007 8 #define INF 0x3f3f3f3f 9 using namespace std; 10 11 typedef pair<int,int> P ;//first 是距离 second是编号 12 struct Edge 13 { 14 int to, cost, next; 15 Edge() {} 16 Edge(int to, int cost, int next) : to(to), cost(cost), next(next) {} 17 }edge1[MAXE], edge2[MAXE]; 18 19 int head1[MAXV], head2[MAXV]; 20 int num1 = 0, num2 = 0; 21 void Add1(int from, int to, int cost) 22 { 23 edge1[num1] = Edge(to, cost, head1[from]); 24 head1[from] = num1++; 25 } 26 27 void Add2(int from, int to, int cost) 28 { 29 edge2[num2] = Edge(to, cost, head2[from]); 30 head2[from] = num2++; 31 } 32 33 int N, M, X; 34 35 int dijkstra(int s,int dist[], int head[], Edge edge[]) 36 { 37 //int dist[MAXV]; 38 priority_queue<P> que; 39 fill(dist, dist+MAXV, INF); 40 dist[s] = 0; 41 que.push(P(0, s)); 42 while (!que.empty()) 43 { 44 P p = que.top(); 45 que.pop(); 46 int t = head[p.second]; 47 if (dist[p.second] < p.first) continue; 48 while (t != -1) 49 { 50 Edge e = edge[t]; 51 if(dist[e.to] > dist[p.second] + e.cost) 52 { 53 dist[e.to] = dist[p.second] + e.cost; 54 que.push(P(dist[e.to], e.to)); 55 } 56 t = e.next; 57 } 58 } 59 } 60 61 int main() 62 { 63 int ans[MAXV]; 64 int dist1[MAXV], dist2[MAXV]; 65 freopen("in.txt", "r", stdin); 66 scanf("%d%d%d", &N, &M, &X); 67 memset(head1, -1, sizeof(head1)); 68 memset(head2, -1, sizeof(head2)); 69 memset(edge1, -1, sizeof(edge1)); 70 memset(edge2, -1, sizeof(edge2)); 71 memset(ans, 0, sizeof(ans)); 72 for (int i = 0; i < M; i++) 73 { 74 int from, to, cost; 75 scanf("%d%d%d", &from, &to, &cost); 76 Add1(from, to, cost); 77 Add2(to, from, cost); 78 } 79 dijkstra(X, dist1, head1, edge1);//正常返回的路径 80 dijkstra(X, dist2, head2, edge2);//路径翻转之后 得到的dist就是 i到达X的路径 81 for (int i = 1; i <= N; i++) 82 { 83 ans[i] = dist1[i] + dist2[i]; 84 } 85 sort(ans+1, ans+N+1); 86 printf("%d\n", ans[N]); 87 return 0; 88 }
以上是关于POJ 3268 Silver Cow Party的主要内容,如果未能解决你的问题,请参考以下文章
POJ 3268 Silver Cow Party (Dijkstra)