POJ 3268
求从原点到达某个点之后返回,来回最长的距离是多少? 比较基础的问题,两遍Dijkstra就可以了。
1:
2: #include <iostream>
3: #include <vector>
4: #include <algorithm>
5: #include <queue>
6: #include <string.h>
7: #include <stdio.h>
8: using namespace std;
9:
10: #define V 1005
11: #define E 100005
12: #define INF 329999
13:
14: // v :the end point of an edge. w : the weight of the weight next:cluster according to the begin point of the edge
15: struct node
16: {
17: int v, w,next;
18: node(int vv=0, int ww=0):v(vv),w(ww){}
19: bool operator < (const node& r) const{return w> r.w;}
20: }pnt[E],pnt1[E];
21:
22: int e=0,N,M,s;
23:
24: int head[V];
25: int dis[V];
26: bool vis[V];
27: int src, sink;
28:
29: void Dijkstra()
30: {
31: priority_queue<node> Q;
32: vis[src] = 1; dis[src] = 0;
33: Q.push(node(src, 0));
34: for (int u = src, i=1; i< N; i++)
35: {
36: for (int j = head[u]; j != -1; j = pnt[j].next) // j is edge number.
37: {
38: int v = pnt[j].v;
39: if (vis[v] == 0 && dis[v] > dis[u] + pnt[j].w )// pre is the current vertex
40: {
41: dis[v] = dis[u] + pnt[j].w;
42: Q.push(node(v, dis[v]));
43: }
44: }
45: while (!Q.empty() && vis[Q.top().v]) Q.pop();
46: if (Q.empty()) break;
47: vis[u = Q.top().v] = 1; Q.pop();
48: }
49: }
50: int head1[V];
51: inline void addedge1(int u, int v, int w)
52: {
53: pnt1[s].v =v; pnt1[s].w = w; pnt1[s].next = head1[u]; head1[u]=s++;
54: }
55: inline void addedge(int u, int v, int w){
56: pnt[e].v = v; pnt[e].w = w; pnt[e].next= head[u]; head[u]=e++;
57: }
58:
59: void Dijkstra_init()
60: {
61: e = 0; s =0;
62: memset(head, -1, sizeof(head));
63: memset(head1, -1, sizeof(head));
64: memset(vis, 0, sizeof(vis));
65: scanf("%d%d", &N , &M);
66: for (int i = 0; i <=N; i++) dis[i] = INF;
67: scanf("%d", &src);
68: //cout<<src<<endl;
69: for(int i=0; i<M; i++)
70: {
71: int a, b, c;
72: scanf("%d%d%d", &a, &b, &c);
73: addedge(a, b, c);
74: addedge1(b,a, c);
75: }
76:
77:
78: }
79:
80: int main()
81: {
82: //freopen("3268.txt","r",stdin);
83:
84: Dijkstra_init();
85: Dijkstra();
86: int dis1[V];
87: for(int i=0; i<=N; i++) dis1[i] = dis[i];
88: //for(int i=1; i<=N; i++) cout<<dis[i]<<" "; cout<<endl;
89: memset(vis, 0 ,sizeof(vis));
90: for(int i=0; i<=N; i++) { dis[i]= INF; head[i] = head1[i];}
91: for(int i=0; i<M; i++)
92: {
93: pnt[i]=pnt1[i];
94:
95: }
96: Dijkstra();
97: //for(int i=1; i<=N; i++) cout<<dis[i]<<" "; cout<<endl;
98: int ret = 0;
99: for(int i=1; i<=N; i++) ret = max(ret, dis1[i]+dis[i]);
100: cout<<ret<<endl;
101: return 0;
102: }
103: