题目链接:https://vjudge.net/contest/327327#problem/D
题意:给出N个点,M条边,X点为终点。求N个点到X点最短路中的最大值(即那个点的最短路最大)。但需注意的是这里的最短路包含去程和回程
数据范围:1<=N<=1000; 1<=M<=100000;1<=Ti<=100;
思路:回程可看作:X点到每个点的最短路(用dijkstra算法即可)
去程(每个点到X点):我们可以反向建边,然后求x点到每个点的最短路
最后:求去程+回程的和的最大值
//#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
#define maxn 1010
#define inf 0x3f3f3f3f
int n,m,ss;
int vis[maxn];
int mp[maxn][maxn];
int mp1[maxn][maxn];
void dijkstra(int ss,int mp[][maxn],int dist[maxn]){
for(int i=1;i<=n;i++){
dist[i]=mp[ss][i];
}
dist[ss]=0;
memset(vis,0,sizeof(vis));
vis[ss]=1;
//先找出第一个点
for(int k=1;k<n;k++)//进行n-1次
{
int minxx=inf,v=0;
for(int i=1;i<=n;i++){
if(!vis[i]&&minxx>dist[i]){
minxx=dist[i];v=i;
}
}
vis[v]=1;
for(int i=1;i<=n;i++){
if(dist[i]>(dist[v]+mp[v][i]))
dist[i]=dist[v]+mp[v][i];
}
}
}
int main(){
int dist[maxn];
int dist1[maxn];
scanf("%d%d%d",&n,&m,&ss);
int x,y,dis;
memset(mp,inf,sizeof(mp));
memset(mp1,inf,sizeof(mp1));
for(int i=1;i<=m;i++){
scanf("%d%d%d",&x,&y,&dis);
mp[x][y]=min(dis,mp[x][y]);
mp1[y][x]=min(dis,mp1[y][x]);
}
//求ss到每个点的最短路
dijkstra(ss,mp,dist); //回程
dijkstra(ss,mp1,dist1); //去程
int maxcost=0;
for(int i=1;i<=n;i++){
maxcost=max(maxcost,dist[i]+dist1[i]);
}
cout<<maxcost<<endl;
}