题意:n只牛在第x只牛家聚会...然后每只牛都走最短路,问所有牛到聚会现场以及回家用时最长的是多少...
有向图...最短路算法都是求单源最短路径...但是一来一回两次,可以先求一次以x为源点的,就是回家的路程,然后再把整个图转置一下,就是a->b是s变为b->a是s就行了...
再求一次最短路即可..最后两个时间相加找最大值就好了..
不得不说图论的inf还是不要开成int上限...调试了半个小时,原来错误就只在爆int...开始以为memcpy不给力..然后又检查各种地方最后自己弄了一组数据发现错了...然后调试的时候发现竟然出现了负数....满满的都是泪
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
#define inf 100000000
int n,m,x;
int map[1111][1111];
int dis1[1111],used[1111],dis[1111];
void dijkstra()
{
for(int i=1;i<=n;i++)
dis[i]=inf;
memset(used,0,sizeof(used));
dis[x]=0;
for(int i=1;i<n;i++)
{
int mini=inf,t=-1;
for(int j=1;j<=n;j++)
{
if(dis[j]<mini&&!used[j])
{
mini=dis[j];
t=j;
}
}
if(t==-1)
break;
used[t]=1;
for(int j=1;j<=n;j++)
{
if(!used[j]&&dis[j]>mini+map[t][j])//此处如果inf是int上限就会爆了int
dis[j]=mini+map[t][j];
}
}
}
int main()
{
while(cin>>n>>m>>x)
{
int u,v,s;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
map[i][j]=i==j?0:inf;
}
for(int i=0;i<m;i++)
{
cin>>u>>v>>s;
map[u][v]=s;
}
dijkstra();
for(int i=0;i<=n;i++)//第一次结果复制过来
dis1[i]=dis[i];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
swap(map[i][j],map[j][i]);
}
}
dijkstra();
int ans=0;
for(int i=1;i<=n;i++)
{
if(dis1[i]!=inf&&dis[i]!=inf)
ans=max(ans,dis1[i]+dis[i]);
}
cout<<ans<<endl;
}
return 0;
}