题目链接:https://vjudge.net/problem/POJ-3268
Silver Cow Party
One cow from each of N farms (1 ≤ N ≤ 1000) conveniently numbered 1…N is going to attend the big cow party to be held at farm #X (1 ≤ X ≤ N). A total of M (1 ≤ M ≤ 100,000) unidirectional (one-way roads connects pairs of farms; road i requires Ti (1 ≤ Ti ≤ 100) units of time to traverse.
Each cow must walk to the party and, when the party is over, return to her farm. Each cow is lazy and thus picks an optimal route with the shortest time. A cow’s return route might be different from her original route to the party since roads are one-way.
Of all the cows, what is the longest amount of time a cow must spend walking to the party and back?
Input
Line 1: Three space-separated integers, respectively: N, M, and X
Lines 2… M+1: Line i+1 describes road i with three space-separated integers: Ai, Bi, and Ti. The described road runs from farm Ai to farm Bi, requiring Ti time units to traverse.
Output
Line 1: One integer: the maximum of time any one cow must walk.
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
Hint
Cow 4 proceeds directly to the party (3 units) and returns via farms 1 and 3 (7 units), for a total of 10 time units.
题意:有N个农场(每个农场一头牛),M条单向边,N农场的牛要去 X 农场参加party,结束之后再返回,这头牛走的时候会选择最短时间内的最佳路线,去的路和回来的路可能会不相同。
思路:很明显就是一道就最短路的题,不过要注意的就是因为这里给出的边都是单向边,牛去 农场X的路径和从农场 X 返回的路径会不相同,所以我们可以利用矩阵转置 来交换e[i][j]和e[j][i]的值 再进行两次dijkstra 相加求出最大值就可以了。
代码;
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 1010
#define inf 0x3f3f3f3f
int e[maxn][maxn];
int dis[maxn],dis2[maxn],book[maxn];
int n,m,x;
void dijkstra(int u)
{
memset(book,0,sizeof(book));
memset(dis,inf,sizeof(dis));
book[u]=1;
for(int i=1; i<=n; i++)
dis[i]=e[u][i];
int minn,k=u,i,j;
for(i=2; i<=n; i++)
{
minn=inf;
for(j=1; j<=n; j++)
if(!book[j]&&minn>dis[j])
{
minn=dis[j];
k=j;
}
book[k]=1;
for(j=1; j<=n; j++)
if(!book[j]&&dis[j]>dis[k]+e[k][j])
dis[j]=dis[k]+e[k][j];
}
}
int main()
{
while(~scanf("%d%d%d",&n,&m,&x))
{
for(int i=1; i<=n; i++)
for(int j=1; j<=n; j++)
if(i==j) e[i][j]=0;
else e[i][j]=inf;
while(m--)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
e[u][v]=min(e[u][v],w);
}
dijkstra(x);
for(int i=1; i<=n; i++)
dis2[i]=dis[i];
for(int i=1; i<=n; i++)
for(int j=i+1; j<=n; j++)
swap(e[i][j],e[j][i]);
dijkstra(x);
int ans=0;
for(int i=1; i<=n; i++)
if(i!=x)
ans=max(ans,dis[i]+dis2[i]);
printf("%d\n",ans);
}
return 0;
}