传送门

有向图,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;
}