题目大意:

题目大意:给你一个有向图,n(1000)个点m(100,000)条路径让你求出各个点到x号点再回到他自己的最短路径的最大值。

分析:

用dijkstra算法可以分别求出各个点到x号点的最短路和x到各个点的最短路。
注意要是用-1来表示该路不通,那代码实现过程中一定要多考虑好多情况。

#include<iostream>
#include<string.h>
#include<math.h>
#define inf 0x3f3f3f3f

using namespace std;

int n,m,x;
int map[1050][1050];
int dis[1050]={0};
int bac[1050]={0};

void my_dijkstra()
{
    int book[1050]={0};
    for(int i=1;i<=n;i++)
    {
        dis[i]=map[i][x];
    }
    for(int i=1;i<n;i++)
    {
        int min=inf;
        int u;
        for(int j=1;j<=n;j++)
        {
            if(book[j]==1)continue;
            if(dis[j]==-1)continue;
            if(dis[j]<min)
            {
                min=dis[j];
                u=j;
            }
        }
        book[u]=1;
        for(int j=1;j<=n;j++)
        {
            if(map[j][u]==-1)continue;
            if(dis[j]>min+map[j][u]||dis[j]==-1)
            {
                dis[j]=min+map[j][u];
            }
        }
    }
}

void my_dijkstra_gai()
{
    int book[1050]={0};
    for(int i=1;i<=n;i++)
    {
        bac[i]=map[x][i];
    }
    for(int i=1;i<n;i++)
    {
        int min=inf;
        int u;
        for(int j=1;j<=n;j++)
        {
            if(book[j]==1)continue;
            if(bac[j]==-1)continue;
            if(bac[j]<min)
            {
                min=bac[j];
                u=j;
            }
        }
        book[u]=1;
        for(int j=1;j<=n;j++)
        {
            if(map[u][j]==-1)continue;
            if(bac[j]>min+map[u][j]||bac[j]==-1)
            {
                bac[j]=min+map[u][j];
            }
        }
    }
}

int main()
{
    while(cin>>n>>m>>x)
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                map[i][j]=-1;
                if(i==j)map[i][j]=0;
            }
        }
        for(int i=1;i<=m;i++)
        {
            int ls,le,lv;
            cin>>ls>>le>>lv;
            map[ls][le]=lv;
        }
        my_dijkstra();
        my_dijkstra_gai();
        int max=0;
        for(int i=1;i<=n;i++)
        {
            if(dis[i]==-1||bac[i]==-1)continue;
            if(max<dis[i]+bac[i])
            {
                max=dis[i]+bac[i];
            }
        }
        /*for(int i=1;i<=n;i++)cout<<dis[i]; cout<<endl; for(int i=1;i<=n;i++)cout<<bac[i]; cout<<endl; */
        cout<<max<<endl;
    }
}