蟲洞(SPFA判斷負圈)

2021-08-20 19:34:28 字數 1483 閱讀 8925

【問題描述】

約翰在他的農場中閒逛時發現了許多蟲洞。蟲洞可以看著一條十分奇特的有向邊,並可以使你返回到過去的時刻(相對你進入蟲洞之前)。約翰的每個農場有m條無向小路連線著n塊地,並有w個蟲洞。現在約翰想借助這些蟲洞回到過去(出發時刻之前並且位置處於起點處),請你告訴他能辦到嗎? 

約翰向你提供了t個農場的地圖。沒有小路會耗費你超過10000秒的時間,當然沒有蟲洞會幫你回到超過10000秒之前。

【輸入格式】

第1行乙個整數t,表示農場數。

接下來,對於每個農場有若干行,第1行輸入三個整數n,m,w,接下來m行每行輸入三個整數a,b,time,表示標號為a的地與標號為b的地用時time秒的小路。接下來w行,每行輸入三個整數a,b,time,表示標號為a的地與標號為b的地中間有一條可以使約翰到達t秒前的蟲洞。

【輸出格式】

如果約翰在這個農場實現他的目標,輸出'yes',否則輸出'no' 。

【輸入樣例】

23 3 1

1 2 2

1 3 4

2 3 1

3 1 3

3 2 1

1 2 3

2 3 4

3 1 8

【輸出樣例】

noyes

【樣例解釋】

對於農場2,fj能通過1->2->3->1回到其出發時刻的前1秒。 

【資料範圍】

1<=f<=5 1<=n<=500 1<=m<=2500 1<=w<=200

分析:這個題大意是給你一些正權無向邊,然後還有一些負權有向邊,問你能不能找到一條路徑使得最後回到起點1時走的邊權和為非正數。

可以知道,一旦發現圖中有乙個與1相通的負圈,那麼總可以在這個圈上走無數次然後再走回1,使得邊權和為非正數,所以只需要知道圖中有沒有至少乙個負圈即可

#include#include#includeusing namespace std;

const int maxn=505;

const int maxm=2505;

const int inf=100000000;

int t,n,m,k,np,last[maxn],dist[maxn],cnt_change[maxn],if_in[maxn];

struct edgee[(maxm+205)*2];

char c;

inline void qkscanf(int &x)

inline void addedge(int u,int v,int w)

; last[u]=np;

}void init()

int q[maxn*maxn];

bool spfa()

} }return 0;

}int main()

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

int flag=spfa();

flag?puts(y):puts(n);

} return 0;

}

SPFA判斷負環

說明一下,這個例題用下面的方法是過不了的,只能過掉25分因為資料加強了,而我不會寫bfs版spfa判負環 但是我覺得會dfs版的就行了,反正對於隨機資料dfs版的絕對吊打bfs版的 只不過這道題的資料不是隨機的,是有人惡意新增的 我們利用dfs強行進行鬆弛操作 我感覺已經不能叫他spfa了 如果在一...

關於spfa 判斷負環

判斷給定的有向圖中是否存在負環。利用spfa 演算法判斷負環有兩種方法 1 spfa 的dfs 形式,判斷條件是存在一點在一條路徑上出現多次。2 spfa 的bfs 形式,判斷條件是存在一點入隊次數大於總頂點數。如下 法 1 spfa 的dfs 形式 include include include ...

最短路專題 spfa判斷負環

題目大意 有多種匯幣,匯幣之間可以交換,這需要手續費,當你用100a幣交換b幣時,a到b的匯率是29.75,手續費是0.39,那麼你可以得到 100 0.39 29.75 2963.3975 b幣。問s幣的金額經過交換最終得到的s幣金額數能否增加 貨幣的交換是可以重複多次的,如果有乙個環使得某種貨幣...