每头奶牛一头N农场(1≤)N≤1000)方便编号1.N将参加在农场举行的大牛派对#X(1≤)X ≤ N)。总共M(1≤)M(≤100,000)单向(单程公路连接一对农场;公路i要求Ti(1≤)Ti≤100)穿越的时间单位。
每头母牛都必须走到派对上,等聚会结束后,再回到她的农场。每头牛都很懒,因此选择了一条最短时间的最佳路线。母牛的返回路线可能与她最初的派对路线不同,因为道路是单向的。
在所有的奶牛中,一头母牛要花多少时间才能走到派对上,然后再回来呢?
输入
第1行:三个空格分隔的整数:N, M,和X
第2行.。M+1:一行i+1描述道路i有三个空格分隔的整数:Ai, Bi,和Ti..描述的道路是从农场开出的。Ai务农Bi,要求Ti穿越的时间单位。
输出量
第1行:一个整数:每头牛必须行走的最长时间。
样本输入
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
样本输出
10
暗示
牛4直接进入党(3单位),并通过农场1和3(7单位)返回,共10个时间单位
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<vector>
#include<cmath>
#include<string>
#include<map>
#include<queue>
using namespace std;
#define INF 0x3f3f3f3f
typedef long long ll;
ll n,dp[1001][1001],dis[1001],flag[1001],d[1001];
//void bfs_spfa(ll x){
memset(dis,INF,sizeof(dis));
memset(flag,0,sizeof(flag));
// for(int i=1;i<=n;i++){
// dis[i]=INF;
// flag[i]=0;
// }
// dis[x]=0;
// flag[x]=1;
// queue<ll>p;
// p.push(x);
// while(!p.empty()){
// ll temp=p.front();
// p.pop();
// flag[temp]=0;
// for(int i=1;i<=n;i++){
// if(dp[temp][i]!=INF&&dis[i]>dis[temp]+dp[temp][i]);
// {
// dis[i]=dis[temp]+dp[temp][i];
// if(!flag[i]){
// p.push(i);
// flag[i]=1;
// }
// }
// }
// }
//}
void Swap(ll &x,ll &y){
if(x==y)return;
ll t=y;
y=x;
x=t;
return ;
}
void dj(ll x){
for(int i=1;i<=n;i++){
dis[i]=dp[x][i];
flag[i]=0;
}
flag[x]=0;
for(int i=1;i<n;i++){
ll max_s=INF,index;
for(int j=1;j<=n;j++){
if(!flag[j]&&max_s>dis[j]){
max_s=dis[j];
index=j;
}
}
flag[index]=1;
for(int k=1;k<=n;k++){
if(!flag[k]&&dis[k]>dis[index]+dp[index][k]){
dis[k]=dis[index]+dp[index][k];
}
}
}
}
int main(){
ll m,x;
cin>>n>>m>>x;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(i==j){
dp[i][i]=0;
}
else dp[i][j]=INF;
}
}
for(int i=1;i<=m;i++){
ll p,q,r;
cin>>p>>q>>r;
if(dp[p][q]>r){
dp[p][q]=r;
}
}
dj(x);
for(int i=1;i<=n;i++){
d[i]=dis[i];
}
//注意路径反转,i和j的关系
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
Swap(dp[i][j],dp[j][i]);
}
}
//母牛从家去目的地x的路径相当于路径反转,从x去母牛家的路径
dj(x);
ll max_s=0;
for(int i=1;i<=n;i++){
if(d[i]!=INF&&dis[i]!=INF&&max_s<dis[i]+d[i]){
max_s=dis[i]+d[i];
}
}
cout<<max_s<<endl;
return 0;
}