題目大意:農夫約翰在探索他的許多農場,發現了一些驚人的蟲洞。蟲洞是很奇特的,因為它是乙個單向通道,可讓你進入蟲洞的前達到目的地!他的n(1≤n≤500)個農場被編號為1…n,之間有m(1≤m≤2500)條路徑,w(1≤w≤200)個蟲洞。作為乙個狂熱的時間旅行fj的愛好者,他要做到以下幾點:開始在乙個區域,通過一些路徑和蟲洞旅行,他要回到最開時出發的那個區域出發前的時間。也許他就能遇到自己了:)。為了幫助fj找出這是否是可以或不可以,他會為你提供f個農場的完整的對映到(1≤f≤5)。所有的路徑所花時間都不大於10000秒,所有的蟲洞都不大於萬秒的時間回溯。
輸入第1行:乙個整數f表示接下來會有f個農場說明。
每個農場第一行:分別是三個空格隔開的整數:n,m和w
第2行到m+1行:三個空格分開的數字(s,e,t)描述,分別為:需要t秒走過s和e之間的雙向路徑。兩個區域可能由乙個以上的路徑來連線。
第m +2到m+ w+1行:三個空格分開的數字(s,e,t)描述蟲洞,描述單向路徑,s到e且回溯t秒。
輸出f行,每行代表乙個農場
每個農場單獨的一行,」 yes」表示能滿足要求,」no」表示不能滿足要求。
思路:直接把蟲洞的時間取負。跑spfa最短路,判斷負環就可以了。
;//dis當前的最短路 vis是否在佇列中
intspfa
(int s)
vis[e[s]
[i].first]=1
;if(spfa
(e[s]
[i].first)==0
) vis[e[s]
[i].first]=0
;}}return1;
}int
main()
int n, m, w;
int x, y, z;
scanf
("%d%d%d"
,&n,
&m,&w)
;for
(int i=
0;i)for
(int i=
0;i)for
(int i=
0;i)//初始化
dis[1]
=0; vis[1]
=1;if
(spfa(1
)==0)
else
}return0;
}
最短路專題 spfa判斷負環
題目大意 有多種匯幣,匯幣之間可以交換,這需要手續費,當你用100a幣交換b幣時,a到b的匯率是29.75,手續費是0.39,那麼你可以得到 100 0.39 29.75 2963.3975 b幣。問s幣的金額經過交換最終得到的s幣金額數能否增加 貨幣的交換是可以重複多次的,如果有乙個環使得某種貨幣...
最短路SPFA演算法(解決負權邊)
演算法思想 實現方法 建立乙個佇列,初始時佇列裡只有起始點,再建立乙個 記錄起始點到所有點的最短路徑 該 的初始值要賦為極大值,該點到他本身的路徑賦為0 然後執行鬆弛操作,用佇列裡有的點作為起始點去重新整理到所有點的最短路,如果重新整理成功且被重新整理點不在佇列中則把該點加入到佇列最後。重複執行直到...
854 Floyd求最短路(不能有負權迴路)
給定乙個n個點m條邊的有向圖,圖中可能存在重邊和自環,邊權可能為負數。再給定k個詢問,每個詢問包含兩個整數x和y,表示查詢從點x到點y的最短距離,如果路徑不存在,則輸出 impossible 資料保證圖中不存在負權迴路。輸入格式 第一行包含三個整數n,m,k 接下來m行,每行包含三個整數x,y,z,...