给定一个牛A,所有牛都要去牛A那里参加活动,参加完后动后返回,所有的路是单向的。 ------------------------------------------------------------------------------ #include<iostream> #include<cstring> #include<stdio.h> #include<math.h> #include<algorithm> using namespace std; const int maxn=10200; #define oo 1100000 int low[maxn]; int Map[1200][1200]; int v[maxn]; int ans,n; void dij(int x) { memset(v,0,sizeof(v)); for(int i=1; i<=n; i++) low[i] = Map[x][i]; v[x] = 1; for(int i=2; i<=n; i++) { int Min = oo; int index; for(int j=1; j<=n; j++) { if(!v[j]&&low[j]<Min) { Min = low[j]; index = j; } } v[index] = 1; for(int j=1; j<=n; j++) if(!v[j]&&low[j]>Min+Map[index][j]) low[j] = Min + Map[index][j]; } } int main() { int a,b,c,m,x; int way[maxn]; while(~scanf("%d%d%d",&n,&m,&x)) { for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { if(i!=j) Map[i][j] = oo; else Map[i][j] = 0; } for(int i=1; i<=m; i++) { scanf("%d%d%d",&a,&b,&c); Map[a][b] = c; } dij(x); for(int i=1;i<=n;i++) way[i] = low[i]; for(int i=1;i<=n;i++)//矩阵交换 for(int j=i+1;j<=n;j++) { int k = Map[j][i]; Map[j][i] = Map[i][j]; Map[i][j] = k; } dij(x); ans = 0; for(int i=1; i<=n; i++) { if(i != x) { ans = max(ans,low[i]+way[i]); } } printf("%d ",ans); } return 0; }