【問題描述】
約翰在他的農場中閒逛時發現了許多蟲洞。蟲洞可以看著一條十分奇特的有向邊,並可以使你返回到過去的時刻(相對你進入蟲洞之前)。約翰的每個農場有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幣金額數能否增加 貨幣的交換是可以重複多次的,如果有乙個環使得某種貨幣...