#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<queue> using namespace std; const int INF=10e8; const int MAXN=1010; int k,minn; int cost[MAXN][MAXN],lowcost[MAXN],lc[MAXN]; bool vis[MAXN]; void Reverse(int n,int cost[][MAXN]) { int t; for(int i=1;i<=n;i++) { for(int j=1;j<i;j++) { t=cost[i][j]; cost[i][j]=cost[j][i]; cost[j][i]=t; } } } void dij(int n,int st) { for(int i=1;i<=n;i++) lowcost[i]=INF,vis[i]=0; lowcost[st]=0; for(int j=1;j<=n;j++) { k=-1,minn=INF; for(int i=1;i<=n;i++) if(!vis[i]&&lowcost[i]<minn) { minn=lowcost[i]; k=i; } if(k==-1) break; vis[k]=1; for(int i=1;i<=n;i++) if(!vis[i]&&lowcost[k]+cost[k][i]<lowcost[i]) lowcost[i]=lowcost[k]+cost[k][i]; } } int main() { int n,m,x; scanf("%d%d%d",&n,&m,&x); int a,b,t; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cost[i][j]=(i==j)?0:INF; while(m--) { scanf("%d%d%d",&a,&b,&t); cost[a][b]=t; } dij(n,x); for(int i=1;i<=n;i++) lc[i]=lowcost[i]; Reverse(n,cost); dij(n,x); int maxi=0; for(int i=1;i<=n;i++) { lc[i]+=lowcost[i]; if(lc[i]>maxi) maxi=lc[i]; } printf("%d\n",maxi); return 0; }
转载于:https://www.cnblogs.com/atmacmer/p/5196916.html