POJ 3259Wormholes

题意:名字很高端的题,虫洞,给定两点直接进行跳跃,问能否回到从某点出发之前的时间,也就是说构成一个回路,形成负环即可,所以说能否构成负环就成为这题的解法,也就是判断负环;

#include<iostream>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<queue>
#include<cstring>
#include<cstdio>
#define INF 0x3f3f3f3f
using namespace std;
int vulue[505][505];
int dis[505];bool vis[505];int ci[505];
int main(){
	int f;
	scanf("%d",&f);
	for(int i=1;i<=f;i++){
		int n,m,w;
		memset(vulue,INF,sizeof(vulue));
		scanf("%d %d %d",&n,&m,&w);
		int a,b,c;
		for(int i=1;i<=m;i++){
			scanf("%d %d %d",&a,&b,&c);
			if(vulue[a][b]!=INF){
				vulue[a][b]=min(vulue[a][b],c);
				vulue[b][a]=min(vulue[b][a],c);
			}
			else{
				vulue[a][b]=c;
				vulue[b][a]=c;
			}
		}
		for(int i=1;i<=w;i++){
			scanf("%d %d %d",&a,&b,&c);
			vulue[a][b]=(-c);
		}
		memset(vis,0,sizeof(vis));
		memset(dis,INF,sizeof(dis));
		memset(ci,0,sizeof(ci));
		queue<int>que;
		que.push(1);
		dis[1]=0;
		ci[1]++;
		vis[1]=1;
		int flag=0;
		while(!que.empty()){
			int u=que.front();
			que.pop();
			vis[u]=0;
		//	cout<<u<<endl;
			for(int j=1;j<=n;j++){
				if(dis[j]>dis[u]+vulue[u][j]){
					dis[j]=dis[u]+vulue[u][j];
					if(vis[j]==0){
						vis[j]=1;
						ci[j]++;
						que.push(j);
						if(ci[j]>n){
							flag=1;
							break;
						}
					}
				}
			}
			if(flag==1){
				break;
			}
		}
		if(flag==1)  printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}


posted @ 2017-10-03 20:25  wang9897  阅读(89)  评论(0编辑  收藏  举报