poj 3268
/*两次单源最短路径 输入的时候一次正向记录路径 一次反向记录路径 */ #include<iostream> #include<cstring> #include<stdio.h> #include<algorithm> using namespace std; #define INF 99999 int t[1001][1001],dd[1001][1001]; int v[1001],dp[1001],dp2[1001]; int n,w; void f(int d[][1001]) { memset(v,0,sizeof(v)); for(int i=1;i<=n;i++) { d[i][i]=0; dp[i]=(i==w?0:INF); } for(int i=1;i<=n;i++) { int x,m=INF; for(int y=1;y<=n;y++) if(!v[y]&&dp[y]<m) { m=dp[y]; x=y; } v[x]=1; for(int y=1;y<=n;y++) if(dp[y]>dp[x]+d[x][y]) dp[y]=dp[x]+d[x][y]; } } int main() { int m; cin>>n>>m>>w; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) {t[i][j]=INF;dd[i][j]=INF;} for(int i=1;i<=m;i++) { int a,b,c; cin>>a>>b>>c; dd[a][b]=c; t[b][a]=c; } f(dd); for(int i=1;i<=n;i++) {dp2[i]+=dp[i];} f(t); int max=0; for(int i=1;i<=n;i++) {dp2[i]+=dp[i]; if(dp2[i]>max) max=dp2[i];} cout<<max<<endl; return 0; }