迪杰斯特拉,算法,题意理解了就好了:N个农场的牛去 K 农场打牌,打完牌再从K农场回到各自的农场,问一来一回过程中走路最长的牛(牛选择最短路走)。然后一个正的最短路,一个反的最短路 就ok了。
#include<stdio.h> #include<string.h> #include<cstring> #include<string> #include<math.h> #include<queue> #include<algorithm> #include<iostream> #include<stdlib.h> #include<cmath> #define INF 0x3f3f3f3f #define MAX 1005 using namespace std; int Map[MAX][MAX],vis[MAX],Go[MAX],Back[MAX],k,n,m; void Godij() { memset(vis,0,sizeof(vis)); int i,j,t,minn; for(i=1; i<=n; i++) Go[i]=Map[k][i]; vis[k]=1; for(i=1; i<n; i++) { minn=INF; for(j=1; j<=n; j++) { if(Go[j] < minn && !vis[j]) { minn=Go[j]; t=j; } } vis[t]=1; for(j=1; j<=n; j++) { if(Go[j] > Go[t]+Map[t][j]) Go[j]=Go[t]+Map[t][j]; } } } void Backdij() { memset(vis,0,sizeof(vis)); int i,j,t,minn; for(i=1; i<=n; i++) Back[i]=Map[i][k]; vis[k]=1; for(i=1; i<n; i++) { minn=INF; for(j=1; j<=n; j++) { if(Back[j] < minn && !vis[j]) { minn=Back[j]; t=j; } } vis[t]=1; for(j=1; j<=n; j++) { if(Back[j] > Back[t]+Map[j][t]) Back[j]=Back[t]+Map[j][t]; } } } int main() { int i,j,u,v,w; while(scanf("%d%d%d",&n,&m,&k)!=EOF) { for(i=0; i<MAX; i++) for(j=0; j<MAX; j++) Map[i][j]=INF; for(i=1; i<=m; i++) { scanf("%d%d%d",&u,&v,&w); Map[u][v]=min(Map[u][v],w); } Godij(); Backdij(); int ans=0; for(i=1; i<=n; i++) { if(i!=k) { ans=max(ans,Go[i]+Back[i]); } } printf("%d ",ans); } return 0; }