poj3268 最短路

大致題意:有一個有向圖,圖中有1-n個點,每個點住着一頭牛,每頭牛現在都要從自己家到點x,再從點x回到自己家,由於牛很懶,所以他們選擇走的路所耗時間最少,讓你求走路時間最長的牛所需時間

測試案例:

input:

4 8 2
1 2 4
1 3 2
1 4 7
2 1 1
2 3 5
3 1 2
3 4 4
4 2 3

output:

10


解題思路:先對點x到其他所有點dijkstra一次,求出x到其他點最短距離,然後將圖中所有的路反向,再對點x dijkstra一次,求出其餘各點到點x最短距離,相加求最大值即可

代碼:

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int maxn=1010,inf=99999999;
int e[maxn][maxn],book[maxn],dis1[maxn],dis2[maxn];

int main()
{
    int i,j,n,m,t1,t2,t3,u,v,minx,x;
    scanf("%d%d%d",&n,&m,&x);

    //初始化
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
            if(i==j) e[i][j]=0;
              else e[i][j]=inf;

    //讀入邊
    for(i=1;i<=m;i++)
    {
        scanf("%d%d%d",&t1,&t2,&t3);
        e[t1][t2]=min(t3,e[t1][t2]);
    }
    //初始化dis數組,這裏是1號頂點到其餘各個頂點的初始路程
    for(i=1;i<=n;i++)
        dis1[i]=e[x][i];
    //book數組初始化
    for(i=1;i<=n;i++)
        book[i]=0;
    book[x]=1;

    //Dijkstra算法核心語句
    for(i=1;i<=n-1;i++)
    {
        //找到離1號頂點最近的頂點
        minx=inf;
        for(j=1;j<=n;j++)
        {
            if(book[j]==0 && dis1[j]<minx)
            {
                minx=dis1[j];
                u=j;
            }
        }
        book[u]=1;
        for(v=1;v<=n;v++)
        {
            if(e[u][v]<inf)
            {
                if(dis1[v]>dis1[u]+e[u][v])
                    dis1[v]=dis1[u]+e[u][v];
            }
        }
    }


    for (i=1;i<=n;i++)
    {
        for (j=i;j<=n;j++)
        {
            swap(e[i][j],e[j][i]);
        }
    }
    for(i=1;i<=n;i++)
        dis2[i]=e[x][i];
    //book數組初始化
    for(i=1;i<=n;i++)
        book[i]=0;
    book[x]=1;

    //Dijkstra算法核心語句
    for(i=1;i<=n-1;i++)
    {
        //找到離1號頂點最近的頂點
        minx=inf;
        for(j=1;j<=n;j++)
        {
            if(book[j]==0 && dis2[j]<minx)
            {
                minx=dis2[j];
                u=j;
            }
        }
        book[u]=1;
        for(v=1;v<=n;v++)
        {
            if(e[u][v]<inf)
            {
                if(dis2[v]>dis2[u]+e[u][v])
                    dis2[v]=dis2[u]+e[u][v];
            }
        }
    }

    int ans=0;
    for (i=1;i<=n;i++)
    {
        ans=max(ans,dis1[i]+dis2[i]);
    }
    printf("%d\n",ans);


    return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章