题意:
题目给定点X 求点X到任意其他一点Y的最短距离和Y到X的最短距离之和的最大值
自己掌握的算法太少
我的方法就是两次dijkstra算法 因为是有向图 dijkstra可以倒着算
1.一次以X为起点求X到任意一点的最小值
2.第二次以X为终点求任意一点到X的最小值
两次得到的数组相加取得最大值即可
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#define error 9999999
int map[1001][1001],low[1001],low1[1001];
int n,m,x;
void dijskral(int st) // 求X到任意一点的最短距离
{
int vis[1001];
memset(vis,0,sizeof(vis));
for(int i=0;i<=n;i++)
low[i]=map[st][i];
vis[st]=1;
while(1)
{
int min=error,pos;
for(int i=0;i<=n;i++)
if(vis[i]!=1&&low[i]<min){
min=low[i];
pos=i;
}
if(min==error) break;
vis[pos]=1;
for(int i=0;i<=n;i++)
{
if(vis[i]!=1)
if(low[pos]+map[pos][i]<low[i])
low[i]=low[pos]+map[pos][i];
}
}
}
void dijskral2(int st) // 求任意一点到X的最短距离
{
int vis[1001];
memset(vis,0,sizeof(vis));
for(int i=0;i<=n;i++)
low1[i]=map[i][st];
vis[st]=1;
while(1)
{
int min=error,pos;
for(int i=0;i<=n;i++)
if(vis[i]!=1&&low1[i]<min){
min=low1[i];
pos=i;
}
if(min==error) break;
vis[pos]=1;
for(int i=0;i<=n;i++)
{
if(vis[i]!=1)
if(low1[pos]+map[i][pos]<low1[i])
low1[i]=low1[pos]+map[i][pos];
}
}
}
int main()
{
int max=0;
scanf("%d%d%d",&n,&m,&x);
for(int i=0;i<=n;i++)
for(int j=0;j<=n;j++)
map[i][j]=error;
for(int i=0;i<m;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
map[a][b]=c;
}
dijskral(x);
dijskral2(x);
for(int i=0;i<=n;i++)
{
low[i]+=low1[i];
if(low[i]<error&&low[i]>max) max=low[i];
}
printf("%d\n",max);
}