程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> SPFA 求帶負權的單源最短路

SPFA 求帶負權的單源最短路

編輯:關於C++
int spfa_bfs(int s)
{
    ///s表示起點;
    queue  q;
    memset(d,0x3f,sizeof(d)); ///d數組中存下的就是最短路徑(存在的話)
    d[s] = 0;
    memset(c,0,sizeof(c));///c數組表示的是某一個節點的入隊次數
    memset(vis,0,sizeof(vis));///一如既往的標記數組

    q.push(s);  vis[s] = 1; c[s] = 1;
    ///頂點入隊vis要做標記,另外要統計頂點的入隊次數
    int OK = 1;///OK用來表示是否有最短路徑
    while(!q.empty())
    {
        int x;
        x = q.front(); q.pop();  vis[x]=0;
        ///隊頭元素出隊,並且消除標記
        for(int k = next[x]; k != -1; k = edge[k].next) ///遍歷頂點x的鄰接表
        {                                 ///但是我個人覺得這種表示鄰接表的方法不大好用
            int y = v[k];                   ///用vector g[maxn]; 應該更好理解
            if(d[x] + w[k] < d[y])
            {
                d[y] = d[x] + w[k];  ///松弛
                if(!vis[y])          ///頂點y不在隊內
                {
                    vis[y] = 1;      ///標記
                    c[y] ++;          ///統計次數
                    q.push(y);       ///入隊
                    if(c[y]>NN)      ///超過入隊次數上限,說明有負環
                        return OK=0;
                }
            }
        }
    }
    return OK;
}


這裡需要注意的是 在讀取邊的過程中,對邊的存儲方式 這將關系到你在遍歷與u相連的節點時 需要操作的內容

上面的存儲方式並不好,有更好的存邊方式,在這裡就直接介紹SPFA的使用方法,不再贅述了


在這裡給出一個鏈接 ,裡面有SPFA的更詳細的介紹和證明,以及SPFA的dfs實現,有興趣的同學可以進去看看~ ________SPFA鏈接biu~

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved