https://vjudge.net/contest/66569#problem/D
trick:1~N各点到X可以通过转置变为X到1~N各点
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<string> 5 #include<algorithm> 6 #include<cmath> 7 8 using namespace std; 9 const int maxn=1e3+5; 10 const int inf=0x3f3f3f3f; 11 int m1[maxn][maxn]; 12 int m2[maxn][maxn]; 13 int n,m,X; 14 int dis[maxn]; 15 int dis2[maxn]; 16 int d[maxn]; 17 void Dijkstra1() 18 { 19 20 bool vis[maxn]; 21 memset(dis,inf,sizeof(dis)); 22 dis[X]=0; 23 memset(vis,0,sizeof(vis)); 24 int v; 25 for(int i=0;i<n;i++) 26 { 27 int m=inf; 28 for(int k=1;k<=n;k++) 29 { 30 if(!vis[k]&&dis[k]<m) 31 { 32 m=dis[k]; 33 v=k; 34 } 35 } 36 vis[v]=1; 37 for(int k=1;k<=n;k++) 38 { 39 if(!vis[k]&&m1[v][k]&&dis[v]+m1[v][k]<dis[k]) 40 { 41 dis[k]=dis[v]+m1[v][k]; 42 } 43 } 44 } 45 } 46 47 void Dijkstra2() 48 { 49 50 bool vis[maxn]; 51 memset(dis2,inf,sizeof(dis2)); 52 dis2[X]=0; 53 memset(vis,0,sizeof(vis)); 54 int v; 55 for(int i=0;i<n;i++) 56 { 57 int m=inf; 58 for(int k=1;k<=n;k++) 59 { 60 if(!vis[k]&&dis2[k]<m) 61 { 62 m=dis2[k]; 63 v=k; 64 } 65 } 66 vis[v]=1; 67 for(int k=1;k<=n;k++) 68 { 69 if(!vis[k]&&m2[v][k]&&dis2[v]+m2[v][k]<dis2[k]) 70 { 71 dis2[k]=dis2[v]+m2[v][k]; 72 } 73 } 74 } 75 } 76 77 int main() 78 { 79 scanf("%d%d%d",&n,&m,&X); 80 int x,y,w; 81 for(int i=0;i<m;i++) 82 { 83 scanf("%d%d%d",&x,&y,&w); 84 m1[x][y]=w; 85 m2[y][x]=w; 86 } 87 Dijkstra1(); 88 Dijkstra2(); 89 int ans=0; 90 for(int i=1;i<=n;i++) 91 { 92 // printf("%d %d\n",dis[i],dis2[i]); 93 d[i]=dis[i]+dis2[i]; 94 ans=max(ans,d[i]); 95 } 96 printf("%d\n",ans); 97 return 0; 98 }