题意:所有牛要去X那里参加聚会,每头牛都走的是最短路,求往返的最长时间~(给出的边是单向的)
思路:dijkstra算法~ 所有牛从X返回时,可看做是求以X为起点的最短路,所有牛去X时,可以将邻接矩阵转置一下~
两次结果求和,再取最大值即可~
AC代码:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; #define inf 0x7ffffff int n,m,x; int edge[1005][1005],d[1005],v[1005]; void dijkstra() { memset(v,0,sizeof(v)); for(int i=1;i<=n;i++) d[i]=(i==x?0:edge[x][i]); for(int i=1;i<=n;i++) { int minn=inf,p; for(int j=1;j<=n;j++) { if(!v[j]&&d[j]<minn) { minn=d[j]; p=j; } } v[p]=1; for(int j=1;j<=n;j++) if(!v[j]) d[j]=min(d[j],d[p]+edge[p][j]); } int ans=-1; return ; } int main() { while(scanf("%d%d%d",&n,&m,&x)!=EOF) { int from,to,w; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { if(i==j) edge[i][j]=0; else edge[i][j]=inf; } while(m--) { scanf("%d%d%d",&from,&to,&w); edge[from][to]=w; } dijkstra(); int d1[1005]; for(int i=1;i<=n;i++) d1[i]=d[i]; for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) { swap(edge[i][j],edge[j][i]); } dijkstra(); int ans=-1; for(int i=1;i<=n;i++) { d1[i]+=d[i]; if(ans<d1[i]) ans=d1[i]; } printf("%d\n",ans); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/mowenwen_/article/details/47003969