POJ 3259 Wormholes(bellman-ford)

 英文理解起來有點累...很多農田,有的農田之間有路相連,從一個農田到另一個農田需要時間,然後有的農田中有蟲洞,可以將你傳送到另一個農場,並且時間會倒退..問FJ有沒有可能在遊歷農場的過程中看到自己...

其實就是問有沒有一個點,能在他從這個點出發前回到這個點,也就是求有沒有負環.轉了一圈後回到這個點時光倒退了,這樣他在這個點等一會就能看到自己了..

求負環自然是Bellman-ford算法了..蟲洞的邊權爲負值,爲單向,但是農田之間路徑是無向的.

#include <cstdio>
using namespace std;
struct Edge{
	int s;
	int e;
	int w;
}ed[5500];
int d[501];
int n,m,w,p;
int bellman(){
	int f,i=0;
	while(1){
		f=0;
		for(int j=0;j<p;j++){
			if(d[ed[j].e]>d[ed[j].s]+ed[j].w){
				f=1;
				d[ed[j].e]=d[ed[j].s]+ed[j].w;
			}
		}
		if(f==0){//在n-1次內結束說明不存在負環 
			return 0;
		}
		if(i>n-1)return 1;//到N-1次還沒結束說明存在負環
		i++;
	}
}
int main(){
	int nCase,s,e,t;
	scanf("%d",&nCase);
	while(nCase--){
		p=0;
		scanf("%d%d%d",&n,&m,&w);
		for(int i=0;i<m;i++){
			scanf("%d%d%d",&s,&e,&t);
			ed[p].s=s;ed[p].e=e;ed[p++].w=t;
			ed[p].s=e;ed[p].e=s;ed[p++].w=t;
		}
		for(int i=0;i<w;i++){
			scanf("%d%d%d",&s,&e,&t);
			ed[p].s=s,ed[p].e=e,ed[p++].w=-t;
		}
		printf(bellman()?"YES\n":"NO\n");
	}
	return 0;
}


 

發佈了91 篇原創文章 · 獲贊 6 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章