题意:第一行 : N个地点 M条路径 到哪里去party
要求去和返回的路不一致 所以只能走一次
求那头牛来回需要的时间多 ,就是距离远
思路:就是求到party的最短路 然后把路径取反,再走一次 把路径加起来 求那个最大就好
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define INF 0x3f3f3f3f
#define maxn 1020
using namespace std;
int n,m,s;
int map[maxn][maxn];
bool vis[maxn];
int d1[maxn];
int d2[maxn];
void dijkstra(int S, int *d)
{
int i,j,now,min;
memset(vis,0,sizeof(vis));
for(i = 1; i <= n; i++)
{
d[i] = map[S][i];
}
vis[S] = 1;
d[S] = 0;
for(i = 1; i <= n - 1; i++)
{
min = INF;
for(j = 1; j <= n; j++)
{
if(!vis[j] && d[j] < min)
{
min = d[j];
now = j;
}
}
vis[now] = 1;
for( j = 1; j <= n; j++)
{
if(!vis[j] && d[now] + map[now][j] < d[j] && map[now][j] < INF)
d[j] = d[now] + map[now][j];
}
}
}
void change()
{
int temp,i,j;
for(i = 1; i <= n; i++)
{
for( j = 1; j < i; j++)
{
temp = map[i][j];
map[i][j] = map[j][i];
map[j][i] = temp;
}
}
}
int main()
{
int x,y,len;
scanf("%d%d%d",&n,&m,&s);
//memset(map,INf,sizeof(map));
memset(d1,0,sizeof(d1));
memset(d2,0,sizeof(d2));
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
map[i][j] = INF;
}
}
for(int i = 1 ; i <= m; i++)
{
scanf("%d%d%d",&x,&y,&len);
map[x][y] = len;
}
dijkstra(s,d1);
change();
dijkstra(s,d2);
int max = 0;
for(int i = 1; i <= n; i++)
{
if(d1[i] < INF && d2[i] <INF && max < d1[i] + d2[i])
{
max = d1[i] + d2[i];
}
}
printf("%d\n",max);
return 0;
}