hdu1874 暢通工程續 Bellman-Ford演算法SPFA

人面桃花相映紅發表於2016-10-17

連線:http://acm.hdu.edu.cn/showproblem.PHP?pid=1874

Problem Description
某省自從實行了很多年的暢通工程計劃後,終於修建了很多路。不過路多了也不好,每次要從一個城鎮到另一個城鎮時,都有許多種道路方案可以選擇,而某些方案要比另一些方案行走的距離要短很多。這讓行人很困擾。

現在,已知起點和終點,請你計算出要從起點到終點,最短需要行走多少距離。

Input
本題目包含多組資料,請處理到檔案結束。
每組資料第一行包含兩個正整數N和M(0

    #include <iostream>  
    #include <cstdio>  
    #include <vector>  
    #include <cstring>  
    #include <queue>  
    //不斷的將s的鄰接點加入佇列,取出不斷的進行鬆弛操作,直到佇列為空  
    //如果一個結點被加入佇列超過n-1次,那麼顯然圖中有負環  
    #define Min(x,y) ( (x) < (y) ? (x) : (y) )  
    using namespace std;  
    const int maxn = 205;  
    const int INF = 0xffffff;  
    struct Node  
    {  
        int vex,weight;  
        Node(int _vex = 0,int _weight = 0) : vex(_vex),weight(_weight){}  
    };  
    vector<Node> G[maxn];  
    int dist[maxn],cnt[maxn],n,m;  
    bool inqueue[maxn];  

    void Init()  
    {  
        for(int i = 0 ; i < maxn ; ++i){  
            G[i].clear();  
            dist[i] = INF;  
        }  
    }  
    int SPFA(int s,int e)  
    {  
        int v1,v2,weight;  
        queue<int> Q;  
        memset(inqueue,false,sizeof(inqueue));//標記是否在佇列中  
        memset(cnt,0,sizeof(cnt));//加入佇列的次數  
        dist[s] = 0;  
        Q.push(s);//起點加入佇列  
        inqueue[s] = true;//標記  
        while(!Q.empty()){  
            v1 = Q.front();  
            Q.pop();  
            inqueue[v1] = false;//取消標記  
            for(int i = 0 ; i < G[v1].size() ; ++i){//搜尋v1的連結串列  
                v2 = G[v1][i].vex;  
                weight = G[v1][i].weight;  
                if(dist[v2] > dist[v1] + weight){ //鬆弛操作  
                    dist[v2] = dist[v1] + weight;  
                    if(inqueue[v2] == false){ //再次加入佇列  
                        inqueue[v2] = true;  
                        //cnt[v2]++; 判負環  
                        //if(cnt[v2] > n) return -1;  
                        Q.push(v2);  
                    }  
                }  
            }  
        }  
        return dist[e];  
    }  
    int main()  
    {  

        int v1,v2,weight,s,e;  
        while(scanf("%d%d",&n,&m) != EOF)  
        {  
            Init();  
            for(int i = 0 ; i < m ; i++){  
                scanf("%d%d%d",&v1,&v2,&weight);  
                G[v1].push_back(Node(v2,weight));  
                G[v2].push_back(Node(v1,weight));  
            }  
            scanf("%d%d",&s,&e);  
            int ans = SPFA(s,e);  
            if(ans == INF)  
                printf("%d\n",-1);  
            else  
                printf("%d\n",ans);  
        }  
        return 0;  
    }  

相關文章