P3385 模板 負環

2022-03-04 21:12:46 字數 1415 閱讀 3142

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

輸入格式:

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

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

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

輸出格式:

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

輸入樣例#1:

2

3 41 2 2

1 3 4

2 3 1

3 1 -3

3 31 2 3

2 3 4

3 1 -8

輸出樣例#1:

n0

ye5

n,m,|w|≤200 000;1≤a,b≤n;t≤10 建議複製輸出格式中的字串。

此題普通bellman-ford或bfs-spfa會tle

solution:

本題需要用到dfs去模擬spfa求負環的過程,因為spfa本質上是廣搜,可能佇列中會有許多無效的點入隊,bfs按層次遍歷可能會很慢,而dfs去模擬spfa則會一直深搜,直到出現點被重複訪問為止便直接跳出搜尋,所以深搜判負環的時間可能會比bfs—spfa快。

**:

#include#define il inline

#define ll long long

#define debug printf("%d %s\n",__line__,__function__)

using

namespace

std;

const

int n=400005

;il

intgi()

intt,n,m,f,dis[n],h[n],net[n],cnt,to[n],v[n];

bool

vis[n];

il void add(int u,int va,int

w)il

void spfa(int

x) dis[to[i]]=dis[x]+v[i];

spfa(to[i]);

}vis[x]=0;}

intmain()

f=0;

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

if(f)puts("

ye5"

);

else puts("n0"

); }

return0;

}

P3385 模板 負環

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

P3385 模板 負環

bellman判負環 bellman ford判負環 洛谷3385 尋找乙個從頂點1所能到達的負環,負環定義為 乙個邊權之和為負的環。從1號頂點開始的負環,若w 0則為單向,否則雙向 存在負環則輸出一行 ye5 不含引號 否則輸出一行 n0 不含引號 14 3 2 3 1 3 4 1 4 2 1 n...

題解 P3385 模板 負環

這題有毒!spfa判負環常用的有兩種,一種是判斷鬆弛次數,但它會繞環好多次,另一種是判斷最短路徑的長度,只要繞環一次,前一種本題過不了。判斷最短路徑的長度的意思就是用乙個len陣列記錄從源點到當前節點的最短路徑經過的邊數,並在鬆弛時令len v len u 1。若len v n則必然存在負環。為了解...