题意:给出n个点和m条边,接着是m条边,代表从牛a到牛b需要花费c时间,现在所有牛要到牛x那里去参加聚会,并且所有牛参加聚会后还要回来,给你牛x,除了牛x之外的牛,他们都有一个参加聚会并且回来的最短时间,从这些最短时间里找出一个最大值输出
用dijkstra求一次从x出发到所有点的最短距离,然后将所有边反向再求一次从x出发到所有点距离,相加求最大。
#include<iostream>
#include<stdio.h>
#include<cstring>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
#include<cmath>
#include<functional>
using namespace std;
#define N 1000+5
#define MAXN 1000000
#define mem(arr,a) memset(arr,a,sizeof(arr))
#define INF 0x3f3f3f3f
#define LL long long int
#define pow(a) (a)*(a)
int d[2][N];
int cost[N][N];
int vis[N];
int n, m, x;
void dijkstra(int s,int flag){
mem(d[flag], INF);
mem(vis, 0);
d[flag][s] = 0;
while (1){
int v = -1;
for (int i = 1; i <= n; i++){
if (!vis[i] && (v == -1 || d[flag][i] < d[flag][v]))v = i;
}
if (v == -1)break;
vis[v] = 1;
for (int i = 1; i <= n; i++){
d[flag][i] = min(d[flag][v] + cost[v][i], d[flag][i]);
}
}
}
int main(){
cin >> n >> m >> x;
mem(cost, INF);
for (int i = 1; i <= m; i++){
int a, b, c;
cin >> a >> b >> c;
cost[a][b] = c;
}
dijkstra(x,0);
for (int i = 1; i <= n; i++){
for (int j = i + 1; j <= n; j++){
swap(cost[i][j], cost[j][i]);
}
}
dijkstra(x, 1);
int MAX = 0;
for (int i = 1; i <= n; i++){
MAX = max(MAX, d[0][i]+d[1][i]);
}
cout << MAX << endl;
}