poj3268
dijkstra简单变形,单目标和单源最短路的结合。poj1511类似
View Code
1 #include <stdio.h>
2 #define MAXN 100010
3 #define MAX 1010
4 #define INF (1<<29)
5 int n,m,x;
6 struct node
7 {
8 int d,t;
9 node* next;
10 }*h1[MAX],e1[MAXN],*p,*h2[MAX],e2[MAXN],*q;
11 bool v[MAX];
12 int t[MAX],sum,max[MAX];
13 void input()
14 {
15 int a,b,c;
16 scanf("%d %d %d",&a,&b,&c);
17 p->d=b;
18 p->t=c;
19 p->next=h1[a];
20 h1[a]=p++;
21 q->d=a;
22 q->t=c;
23 q->next=h2[b];
24 h2[b]=q++;
25 }
26 void dij(bool f)
27 {
28 for(int i=1;i<=n;++i)
29 {
30 v[i]=false;
31 t[i]=(i==x?0:INF);
32 }
33 int k=-1,a;
34 while(k!=INF)
35 {
36
37 k=INF;
38 for(int i=1;i<=n;++i)
39 if(!v[i]&&k>t[i])
40 k=t[i],a=i;
41 v[a]=true;
42 for(p=(f?h1[a]:h2[a]);p;p=p->next)
43 if(!v[p->d]&&t[p->d]>t[a]+p->t)
44 t[p->d]=t[a]+p->t;
45 }
46 for(int i=1;i<=n;++i)
47 max[i]+=t[i];
48 }
49 int main()
50 {
51 while(scanf("%d %d %d",&n,&m,&x)==3)
52 {
53 p=e1,q=e2;
54 for(int i=1;i<=n;++i)
55 h1[i]=h2[i]=NULL,max[i]=0;
56 for(int i=0;i<m;++i)
57 input();
58 dij(true);
59 dij(false);
60 sum=0;
61 for(int i=1;i<=n;++i)
62 sum=(sum>max[i]?sum:max[i]);
63 printf("%d\n",sum);
64 }
65 return 0;
66 }