题意:所有牛要去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;
}