hdu 2680 Choose the best route

http://acm.hdu.edu.cn/showproblem.php?pid=2680

這個題目其實是屬於簡單的最短路問題   但要注意一點  否則會超時哦

Dijkstra 算法       這個算法重點是 假設有二個頂點集合A   B   先假設所有的頂點全部都是屬於 A 吧  拿出一個頂點出來  假設是V1   然後計算剩下的每個頂點到 V1 的距離    然後找出一個最短的距離 假設 Vi 到V1的距離最短    然後把Vi放進 B集合中   更新剩下 每個點到 VI 的距離 重複上面的操作   呵呵  

#include<iostream>
#include<cstring>
using namespace std;
int a[1002][1002];
bool visit[1002];
int dis[1002];
int n,m,s;
#define max 9999999
void Dijkstra(int ss)  ///s代表終點  ss代表起點
{
    memset(visit,false,sizeof(visit));

    int i=0,k;
    for(i=0;i<n;i++)
    dis[i]=a[ss][i];
    dis[ss]=0;

    for(i=0;i<n;i++)
    {
        int min=max;
        for(int j=0;j<n;j++)
        {
            if(!visit[j]&&dis[j]<min)
            {
                min=dis[j];
                k=j;
            }
        }
        if(min==max) break;

        visit[k]=true;
        for(int j=0;j<n;j++)
        {
            if(!visit[j])
                if(dis[k]+a[k][j]<dis[j])
                {
                    dis[j]=dis[k]+a[k][j];
                }
        }
    }
}
int main()
{
    int p,q,t,i,j,w,h;
    while(cin>>n>>m>>s)
    {
        for(i=0;i<n;i++)
        for(j=0;j<n;j++)
        a[i][j]=max;

        while(m--)
        {
            cin>>p>>q>>t;
            p=p-1;
            q=q-1;
            if(a[q][p]>t)
            a[q][p]=t;  ///這裏要注意一下 是有向圖  我剛開始就這裏錯了   找了好久
        }
        Dijkstra(s-1);  ///終點不一定是終點   起點也不一定是起點
        cin>>w;
        int  min=max;

        for(i=0;i<w;i++)
        {
            cin>>h;
           /// cout<<"dis[h-1]  "<<dis[h-1]<<endl;
            if(dis[h-1]<min) min=dis[h-1];
        }

        if(min!=max) cout<<min<<endl;
        else cout<<"-1"<<endl;

    }
    return 0;
}


 

 

發佈了46 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章