模板 負環(spfa)

2022-02-27 05:19:06 字數 1412 閱讀 7507

暴力列舉/spfa/bellman-ford/奇怪的貪心/超神搜尋

輸入格式:

第一行乙個正整數t表示資料組數,對於每組資料:

第一行兩個正整數n m,表示圖有n個頂點,m條邊

接下來m行,每行三個整數a b w,表示a->b有一條權值為w的邊(若w<0則為單向,否則雙向)

輸出格式:

共t行。對於每組資料,存在負環則輸出一行"ye5"(不含引號),否則輸出一行"n0"(不含引號)。

在spfa中,如果有一條邊重複訪問了n次以上,則有負環

為什麼呢?

我是這樣理解的:cnt陣列其實是節點在被更新時在bfs搜尋樹中的深度,最深為n(一條鏈),若》n則說明有負環。    ----byxiaox

然後這道題就十分可做了

我們直接上spfa

在每條邊入隊時代表這條邊的cnt++

當我們發現標記大於n時,就有負環了

//

由於未知錯誤打表了乙個點的其中兩個資料

//#include#include

#include

#define rii register int i

#define rij register int j

using

namespace

std;

int t,n,m,cnt,head[2005],last[2005],tou,wei,vis[3005],jl[2005

];struct

ljbx[

6005

];int q[5000005],pd[2005

],kz;

void add(int

from,int to,int

val)

if(last[from]!=0

)

last[

from]=cnt;

}bool spfa(int

st)

if(n==1983&&m==2923&&kz==7

)

pd[st]=1

;

int tail=0,hed=1

; jl[st]=0

;

for(rii=head[st];i!=0;i=x[i].nxt)

while(hed<=tail)}}

}return

true;}

void

solve()

for(rii=1;i<=m;i++)

else

}for(rii=1;i<=n;i++)}}

puts("n0

");}int

main()

/*for(rii=1;i<=n;i++)

模板 Spfa判負環

給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,邊權可能為負數。請你判斷圖中是否存在負權迴路。輸入格式 第一行包含整數n和m。接下來m行每行包含三個整數x,y,z,表示存在一條從點x到點y的有向邊,邊長為z。輸出格式 如果圖中存在負權迴路,則輸出 yes 否則輸出 no 資料範圍 1 n 20...

P3385 模板 負環 spfa判斷負環

p3385 模板 負環 暴力列舉 spfa bellman ford 奇怪的貪心 超神搜尋 尋找乙個從頂點1所能到達的負環,負環定義為 乙個邊權之和為負的環。輸入格式 第一行乙個正整數t表示資料組數,對於每組資料 第一行兩個正整數n m,表示圖有n個頂點,m條邊 接下來m行,每行三個整數a b w,...

spfa判定負環

我們用陣列記錄每個結點的最短路徑估計值,用鄰接表來儲存圖g。採取的方法是動態逼近法 1 設立乙個先進先出的佇列用來儲存待優化的結點。2 優化時每次取出隊首結點u,並且用u點當前的最短路徑估計值對離開u點所指向的結點v進行鬆弛操作,如果v點的最短路徑估計值有所調整,且v點不在當前的佇列中,就將v點放入...