Bellman ford演算法判斷有無負環

2021-08-08 02:22:30 字數 1224 閱讀 2683

本文**:

bellman-ford演算法是一種求單源最短路演算法,時間複雜度:o(v * e)(v為圖的節點數,e為圖的邊數),效率很低,但比起dijkstra演算法,它可以處理負權邊,而且能判斷源點是否有負權環(floyd演算法只能求最短路不能判斷有無),即從源點經過一段路後回到原點有無負權和。

bellman-ford演算法:

#include

#include

#include

#include

#include

using

namespace

std;

#define ll long long

#define nmax 2502

#define inf 0x7f7f7f7f

#define eps 10^(-6)

#define mem(a) memset(a,0,sizeof(a));

#define mem_max(a) memset(a,inf,sizeof(a));

#define for(i,n) for(int i=0;i#define fin freopen("in.txt","r",stdin);

#define fout freopen("out.txt","w",stdout);

struct node

edge[nmax*2+201];

int dis[nmax]; //源點到各點距離

int n,m,w; //n:節點數,m:正權雙向邊數,w:負權邊數

int cnt; //總邊數:不等於m+w,因為雙向邊要算兩條邊

int bellman_ford(int src)

}if(!flag) //優化:如果沒一條邊更新,則最短路完成或有邊不可達

break;

}for(int i=1;i<=cnt-1;i++)

if(dis[edge[i].u] + edge[i].w < dis[edge[i].v])

return

0; return1;}

int main()

for(int i=1;i<=w;i++)

if(bellman_ford(1))

printf("no\n");

else

printf("yes\n");

}return

0;}

Bellman Ford判斷有負環的演算法模板

include include include include include include include include include includeusing namespace std typedef long long ll const int int max 0x07777777 c...

Bellman Ford演算法,SPFA演算法

bellman ford 演算法能在更普遍的情況下 存在負權邊 解決單源點最短路徑問題。對於給定的帶權 有向或無向 圖g v,e 其源點為 s,加權函式w是 邊集e 的對映。對圖g執行 bellman ford 演算法的結果是乙個布林值,表明圖中是否存在著乙個從源點s 可達的負權迴路。若不存在這樣的...

Bellman ford 演算法詳解

昨天說的dijkstra固然很好用,但是卻解決不了負權邊,想要解決這個問題,就要用到bellman ford.我個人認為bellman ford比dijkstra要好理解一些,還是先上資料 有向圖 5 712 8135 23 6 5 4 324 735 2 45 3 在講述開,先設幾個陣列 orig...