/*Bellman-Ford算法偽代碼:for(i=0;i<n-1;i++)//執(zhí)行n-1輪操作,其中n為頂點(diǎn)數(shù){ for(each edge u->v)//每輪操作都遍歷所有邊 { if(d[u]+length[u->v]<d[v])//以u(píng)為中介點(diǎn)可以使d[v]更小 { d[v] = d[u] + length[u->v];//松弛操作 } }}for(each edge u->v)//對(duì)每條邊進(jìn)行判斷{ if(d[u] + length[u->v]<d[v])//如果仍可以被松弛 { return false;//說(shuō)明圖中有從源點(diǎn)可達(dá)的負(fù)環(huán) }}return true;*///下面是完整Bellman-ford算法的代碼,圖是鄰接表形式,時(shí)間復(fù)雜度為O(VE)//若是鄰接矩陣形式,時(shí)間復(fù)雜度會(huì)到O(V^3)#include<vector>#include<algorithm>using namespace std;const int MAXV = 1000;const int INF = 1000000000;struct Node{ int v, dis;//v為鄰接邊的目標(biāo)頂點(diǎn),dis為鄰接邊的邊權(quán)};vector<Node> Adj[MAXV];//圖G的鄰接表int n;//n為頂點(diǎn)數(shù),MAXV為最大頂點(diǎn)數(shù)int d[MAXV];//起點(diǎn)到達(dá)各點(diǎn)的最短路徑長(zhǎng)度bool Bellman(int s)//s為源點(diǎn){ fill(d, d + MAXV, INF); d[s] = 0;//起點(diǎn)s到達(dá)自身的距離為0 //以下為求解數(shù)組d的部分 for (int i = 0; i < n - 1; i++)//執(zhí)行n-1輪操作,n為頂點(diǎn)數(shù) { for (int u = 0; u < n; u++)//每輪操作都遍歷所有的邊 { for (int j = 0; j < Adj[u].size(); j++) { int v = Adj[u][j].v;//鄰接邊的頂點(diǎn) int dis = Adj[u][j].dis;//鄰接邊的權(quán) if (d[u] + dis < d[v])//以u(píng)為中介點(diǎn)可以使d[v]更小 { d[v] = d[u] + dis;//松弛操作 } } } } //以下為判斷負(fù)環(huán)的代碼 for (int u = 0; u < n; u++)//對(duì)每條邊進(jìn)行判斷 { for (int j = 0; j < Adj[u].size(); j++) { int v = Adj[u][j].v;//鄰接表的頂點(diǎn) int dis = Adj[u][j].dis;//鄰接邊的邊權(quán) if (d[u] + dis < d[v])//如果仍可以被松弛 { return false;//說(shuō)明圖中有從源點(diǎn)可達(dá)的負(fù)環(huán) } } } return true;//數(shù)組d的所有值都已經(jīng)達(dá)到最優(yōu)}/*實(shí)質(zhì)是對(duì)最短路徑樹(shù)的逐層松弛*/
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注