UESTC 914 方老师的分身I Dijkstra

题意:求有向图的往返最短路的最长长度。

分析:求第一次到所有点的距离可以用一次Dijkstra求最短路求出来。考虑回来的路,想想就知道,从每个点回来的路即为将边的方向反转再求一次最短路后的结果。

所以此题为求两次最短路。

代码:

#include <iostream>

#include <cstdio>

#include <cstring>

#include <cmath>

#include <algorithm>

#define Mod 1000000007

using namespace std;

#define N 1007



int mp[N][N],n,m;

int dis[N],vis[N],dis2[N];



void Dijastra(int s,int *dis)

{

    int now = s;

    int i,k;

    dis[now] = 0;

    vis[now] = 1;

    for(i=1;i<=n;i++)

    {

        for(k=1;k<=n;k++)  //order 1

        {

            if(mp[now][k] != Mod && dis[now] + mp[now][k] < dis[k])

                dis[k] = dis[now] + mp[now][k];

        }

        int mini = Mod;   //order 2

        for(k=1;k<=n;k++)

        {

            if(dis[k] < mini && !vis[k])

            {

                now = k;

                mini = dis[k];

            }

        }

        vis[now] = 1;

    }

}



int main()

{

    int u,v,w,i,j,x;

    while(scanf("%d%d%d",&n,&m,&x)!=EOF)

    {

        for(i=1;i<=n;i++)

            dis[i] = Mod;

        dis[x] = 0;

        for(i=1;i<=n;i++)

        {

            for(j=i;j<=n;j++)

                mp[i][j] = mp[j][i] = Mod;

            mp[i][i] = 0;

        }

        while(m--)

        {

            scanf("%d%d%d",&u,&v,&w);

            mp[u][v] = w;

        }

        memset(vis,0,sizeof(vis));

        Dijastra(x,dis);

        for(i=1;i<=n;i++)

            dis2[i] = Mod;

        dis2[x] = 0;

        for(i=1;i<=n;i++)

        {

            for(j=i+1;j<=n;j++)

            {

                swap(mp[i][j],mp[j][i]);

            }

        }

        memset(vis,0,sizeof(vis));

        Dijastra(x,dis2);

        int maxi = -1;

        for(i=1;i<=n;i++)

        {

            if(dis[i] < Mod && dis2[i] < Mod)

                maxi = max(maxi,dis[i]+dis2[i]);

        }

        printf("%d\n",maxi);

    }

    return 0;

}
View Code

 

你可能感兴趣的:(dijkstra)