最短路径–dijkstra–Silver Cow Party
Description
每头奶牛一头N农场(1≤)N≤1000)方便编号1.N将参加在农场举行的大牛派对#X(1≤)X ≤ N)。总共M(1≤)M(≤100,000)单向(单程公路连接一对农场;公路i要求Ti(1≤)Ti≤100)穿越的时间单位。
每头母牛都必须走到派对上,等聚会结束后,再回到她的农场。每头牛都很懒,因此选择了一条最短时间的最佳路线。母牛的返回路线可能与她最初的派对路线不同,因为道路是单向的。
在所有的奶牛中,一头母牛要花多少时间才能走到派对上,然后再回来呢?
Input
第1行:三个空格分隔的整数:N, M,和X
第2行…。M+1:一行i+1描述道路i有三个空格分隔的整数:Ai, Bi,和Ti。描述的道路是从农场开出的。Ai务农Bi,要求Ti穿越的时间单位。
Output
第1行:一个整数:每头牛必须行走的最长时间。
Sample Input
4 8 2
1 2 4
1 3 2
1 4 7
2 1 1
2 3 5
3 1 2
3 4 4
4 2 3
Sample Output
10
dijkstra水题,只用注意路径重复的长度问题
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <math.h>
#include <string.h>
#include <string>
#include <stack>
#include <queue>
#include <map>
using namespace std;
const int inf=0x3f3f3f3f;
const int MAX=1e3+5;
int m[MAX][MAX];
int d[MAX],a[MAX];
bool f[MAX];
int N,M,X;
void dijkstra()
{
memset(f,true,sizeof(f));
memset(d,inf,sizeof(d));
d[X]=0;
while(true)
{
int v=-1;
for(int i=1;i<=N;i++)
{
if(f[i]&&(v==-1||d[v]>d[i]))
v=i;
}
if(v==-1)
return ;
f[v]=false;
for(int i=1;i<=N;i++)
{
d[i]=min(d[i],d[v]+m[v][i]);
}
}
}
int main()
{
memset(m,inf,sizeof(m));
cin>>N>>M>>X;
while(M--)
{
int a,b,c;
cin>>a>>b>>c;
m[a][b]=c;
}
dijkstra();
for(int i=1;i<=N;i++)
{
a[i]=d[i];
}
for(int i=1;i<=N;i++)
{
for(int j=1;j<=i;j++)
{
swap(m[i][j],m[j][i]);
}
}
dijkstra();
int ans=0;
for(int i=1;i<=N;i++)
{
ans=max(ans,d[i]+a[i]);
}
cout<<ans<<endl;
return 0;
}