题目大意:给出n个点和m条边,接着是m条边,代表从牛a到牛b需要花费c时间,现在所有牛要到牛x那里去参加聚会,并且所有牛参加聚会后还要回来,给你牛x,除了牛x之外的牛,他们都有一个参加聚会并且回来的最短时间,从这些最短时间里找出一个最大值输出
链接:点我
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
using namespace std;
#define MOD 1000000007
#define pb(a) push_back(a)
const int INF=0x3f3f3f3f;
const double eps=1e-;
typedef long long ll;
#define cl(a) memset(a,0,sizeof(a))
#define ts printf("*****\n");
int n,m,tt,cnt;
const int MAXN=;
#define typec int
bool vis[MAXN];
int pre[MAXN];
int cost[MAXN][MAXN];
int dist1[MAXN],dist2[MAXN];
void Dijkstra(typec lowcost[],int n,int beg)
{
for(int i=;i<=n;i++)
{
lowcost[i]=INF;vis[i]=false;pre[i]=-;
}
lowcost[beg]=;
for(int j=;j<n;j++)
{
int k=-;
int Min=INF;
for(int i=;i<=n;i++)
if(!vis[i]&&lowcost[i]<Min)
{
Min=lowcost[i];
k=i;
}
if(k==-)break;
vis[k]=true;
for(int i=;i<=n;i++)
if(!vis[i]&&lowcost[k]+cost[k][i]<lowcost[i])
{
lowcost[i]=lowcost[k]+cost[k][i];
pre[i]=k;
}
}
}
int main()
{
int i,j,k;
#ifndef ONLINE_JUDGE
freopen("1.in","r",stdin);
#endif
int x;
while(scanf("%d%d%d",&n,&m,&x)!=EOF)
{
for(i=;i<=n;i++) for(j=;j<=n;j++) if(i==j) cost[i][j]=;else cost[i][j]=INF;
int u,v,w;
for(i=;i<m;i++)
{
scanf("%d%d%d",&u,&v,&w);
cost[u][v]=min(cost[u][v],w);
}
Dijkstra(dist1,n,x);
for(i=;i<=n;i++)
{
for(j=;j<i;j++) swap(cost[i][j],cost[j][i]);
}
Dijkstra(dist2,n,x);
int ans=;
for(i=;i<=n;i++)
ans=max(ans,dist1[i]+dist2[i]);
printf("%d\n",ans);
}
}