n头牛去x和n头牛从x返回到原来的点,路是单向路,因为dijkstra的算法是从一个顶点开始遍历,dis记载这个顶点到其他点的最短距离,没有方向。所以来一次和去一次的时候,路要反转一次,虽然算的还是顶点到其他点的距离是多少,但是遍历的时候,如果是单向路的话,经过反转已经不能走了,找其他的路。
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
int n,m,x;
int dis[1050];
int map[1050][1050];
bool vis[1050];
int sum1[1050],sum2[1050];
void init()
{
memset(dis,INF,sizeof(dis));
memset(vis,false,sizeof(vis));
}
void dijkstra(int s)
{
dis[s]=0;
for(int i=1;i<=n;i++)
{
int pos=0;
int minn=INF;
for(int j=1;j<=n;j++)
{
if(!vis[j]&&dis[j]<minn)
{
minn=dis[j];
pos=j;
}
}
vis[pos]=true;
for(int j=1;j<=n;j++)
if(!vis[j]&&dis[j]>dis[pos]+map[pos][j])
dis[j]=dis[pos]+map[pos][j];
}
}
int main()
{
cin>>n>>m>>x;
int a,b,c;
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++)
map[i][j]=INF;
while(m--)
{
cin>>a>>b>>c;
map[a][b]=c;
}
init();
dijkstra(x);
for(int i=1;i<=n;i++)
sum1[i]=dis[i];
for(int i=1;i<=n;i++)
for(int j=1;j<i;j++)
swap(map[i][j],map[j][i]);
init();
dijkstra(x);
for(int i=1;i<=n;i++)
sum2[i]=dis[i];
int ans=-100000;
for(int i=1;i<=n;i++)
ans=max(ans,sum1[i]+sum2[i]);
cout<<ans<<endl;
return 0;
}