标签:
***两边dijstra,最后求出和最大,值得注意的是,单项路径一定要注意方向,不然就是错的。。***
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<queue> #include<algorithm> using namespace std; #define N 1010 #define INF 0x3f3f3f3f int maps[N][N]; int n, m, x; int dist1[N], dist2[N], vis[N]; void Init() { for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) maps[i][j]=i==j ? 0 : INF; } void dij() { for(int i=1; i<=n; i++) dist1[i]=maps[i][x]; memset(vis, 0, sizeof(vis)); vis[x]=1; for(int i=1; i<=n; i++) { int Min=INF, index=-1; for(int j=1; j<=n; j++) { if(!vis[j]&&dist1[j]<Min) { Min=dist1[j]; index=j; } } if(index==-1) break; vis[index]=1; for(int j=1; j<=n; j++) { if(!vis[j]&&dist1[j]>maps[j][index]+dist1[index]) dist1[j]=maps[j][index]+dist1[index]; } } for(int i=1; i<=n; i++) dist2[i]=maps[x][i]; memset(vis, 0, sizeof(vis)); vis[x]=1; for(int i=1; i<=n; i++) { int Min=INF, index=-1; for(int j=1; j<=n; j++) { if(!vis[j]&&dist2[j]<Min) { Min=dist2[j]; index=j; } } if(index==-1) break; vis[index]=1; for(int j=1; j<=n; j++) { if(!vis[j]&&dist2[j]>dist2[index]+maps[index][j]) dist2[j]=dist2[index]+maps[index][j]; } } } int main() { while(~scanf("%d%d%d", &n, &m, &x)) { Init(); int u, v, len; for(int i=1; i<=m; i++) { scanf("%d%d%d", &u, &v, &len); maps[u][v]=min(len, maps[u][v]); } dij(); int ans=-1; for(int i=1; i<=n; i++) { if(dist1[i]+dist2[i]>ans) ans=dist1[i]+dist2[i]; } printf("%d\n", ans); } return 0; }
标签:
原文地址:http://www.cnblogs.com/9968jie/p/5688293.html