有向图,1——n个点 输入其中一个点x,求x点到其他点的距离和其他点到x的距离之和最短 ,一开始果断用了floyd结果超时了尝试了两次迪杰斯特拉,。。。结果居然过了不明觉厉,先用迪杰斯特拉求出x到其他所有点的距离之和,再把map[i][j]和map[j][i]swap一下就变成了从其他点到x了。很经典的迪杰斯特拉变形。
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int inf = 0x3f3f3f3f;
const int maxn = 1055;
int dis[maxn],vis[maxn],mp[maxn][maxn],n,m,arr[maxn];
void Dijkstra(int bg,int en)
{
memset(vis,0,sizeof(vis));
for(int i = 1;i <= n; i++)
dis[i] = mp[bg][i];
int minn = inf,k;
for(int i = 1;i <= n; i++)
{
minn = inf;
for(int j = 1;j <= n; j++)
{
if(!vis[j] && dis[j] < minn)
{
minn = dis[j];
k = j;
}
}
vis[k] = 1;
for(int j = 1;j <= n; j++)
if(!vis[j])
dis[j] = min(dis[j],dis[k] + mp[k][j]);
}
for(int i = 1;i <= n; i++)
arr[i] += dis[i];
}
int main()
{
int x;
scanf("%d %d %d",&n,&m,&x);
for(int i = 1;i <= n; i++)
for(int j = 1;j <= n; j++)
if(i != j)
mp[i][j] = inf;
memset(arr,0,sizeof(arr));
int a,b,c;
while(m--)
{
scanf("%d %d %d",&a,&b,&c);
mp[a][b] = c;
}
Dijkstra(x,n);
for(int i = 1;i < n; i++)
for(int j = i+1;j <= n; j++)
swap(mp[i][j],mp[j][i]);
Dijkstra(x,n);
int sum = 0;
for(int i = 1;i <= n; i++)
sum = max(sum,arr[i]);
printf("%d\n",sum);
return 0;
}