在判斷圖的方向的問題時,需要仔細看一下:有向圖+無向圖相當於有向圖+雙向有向圖=有向圖,在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...