POJ3259 bellman ford判定負環

2021-08-22 13:34:36 字數 1070 閱讀 9033

在判斷圖的方向的問題時,需要仔細看一下:有向圖+無向圖相當於有向圖+雙向有向圖=有向圖,在bellman-ford的鬆弛階段只需要更新弧尾端點就行。無向圖相當於雙向的有向圖 ,弧尾就是弧頭。在這裡解釋一下鬆弛操作的問題:

1.對於有向弧a->b:我們的鬆弛操作實質上是用a的結點值和ab弧的權值來推導b的結點值

2.對於無向弧,我們實質上是同時鬆弛a->b和b->a,就是將無向弧當做兩個有向弧來處理

在這個題中,最開始我的錯誤在於將大路和蟲洞都當做無向弧來處理,

3.關於無向圖和有向圖的問題,關鍵是要理解題意。

在此題中,蟲洞作為邊權為負值的有向圖,大路作為邊權為正的無向圖。利用bellman-ford演算法對負圈的判定程式,對所有邊鬆弛n-1次後還能鬆弛,說明存在負環即可。

#include#include#include#includeusing namespace std;

const int maxn=505;

const int maxm=2505<<1;

const int maxw=205;

const int inf=0x3f3f3f3f;

int dis[maxn];

int edge[maxm+maxw][2];//0表示起點,1表示終點

//有向圖

int time[maxm+maxw];//時間,邊的權值

int f,n,m,w,a,b,t,cnt;//cnt是邊的數量

void init()

bool bellman_ford()//1表示有負圈

}if(flag)

return false;//不再進行鬆弛操作

}for(int j=0; jdis[pp]+time[j])

return true;

}return false;

}int main()

for(int i=cnt; iif(bellman_ford())

printf("yes\n");

else

printf("no\n");

}return 0;

}

POJ3259負環判定

題意 有n個頂點,m條邊,然後有w個洞,過每個洞的時間為 ti,求是否會時光倒流 分析 就是求是否存在負圈,用bellman floyd判定是否存在負圈即可,注意是無向圖,所以路徑是雙向可達的 1 include 2 include 3 include 4 include 5 include 6 i...

基礎最短路六 POJ3259

poj3259 n為500,m為2500 題目大意 有乙個人在n個點之間走來走去。n個點之間有雙向的道路,也有單向的 可以回到幾秒前的蟲洞。問 存不存在一種走法,走來走去走來走去,走回到起點的時候,時間剛好在自己出發以前?又是乙個spfa尋找負環問題!輸入蟲洞的時候,權改為負數。輸出的是 yes 和...

POJ 3259 SPFA判斷負權迴路

spfa 是bellman ford的一種優化 spfa 用於求負權存在的最短路,判斷是否有負權迴路,只需判斷鬆弛邊的次數,如果大於n,就說明存在負權迴路 include include include include include include define n 5501 using name...