jzyzoj 1216 poj虫洞 3259 Bellman_Ford模板

版权声明:本博客版权属于BIGBIGPPT,未经允许不得商用 https://blog.csdn.net/BIGBIGPPT/article/details/87904992

描述 Description
在一个神秘岛上,有N(1 <= N <= 500)个洞口,标号1…N,它们之间有M (1 <= M <= 2500) 条通道相连。神秘的竟然另外还有W (1 <= W <=200)条传说中的时间虫洞----当到达通道的另一端洞口时,竟然可以比进入的时间要早!
你当然想进行这样的时间之旅,希望从一个洞口s出发,经过几个通道,在比出发早些时候的时间回到洞口s。也许还能碰到自己呢,hehe
根据给定的地图,请判断能否实现这样的愿望。
输入格式 Input Format
第一行:一个整数 F (1 <= F <= 5),表示共有F组数据。(多组数据测试)
每组数据:
第1行:三个整数 N M W
   第2至M+1行:每行三个整数 (S, E, T),表示在S与E洞口之间有一个双向通道,通过需要T(0 <= T <= 10)
   样例输入 sample input
2
3 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
样例输出 sample output
NO
YES
这道题说想通过虫洞找到出发前的自己,那么首先想能走一圈回来到原点说明是一个环;
耗费比之前的小说明环是负环,那么显然只要有负环就可以满足题意,因为你可以通过负环不断地回到更早一点的时间,然后你就可以为所欲为了(手动滑稽);
咳咳,那么这道题数据量也不大,我们就可以每次直接用Bellman——Ford判断是否有负环,有负环的话就输出YES,没就输出NO。
嗯,记住YES和NO全大写,
我写的时候没看清,结果就被这个坑了QAQ

代码:

#include<bits/stdc++.h>

#define MAXN 100010
#define INF 0x3f3f3f

using namespace std;

struct node{
	int x,y,ne,z;
}e[MAXN];

int lin[MAXN],len = 0;
inline void addedge(int x,int y,int z){
	e[++len].x = x;e[len].y = y;e[len].z = z;
	e[len].ne = lin[x]; lin[x] = len;
}

int n,m,w;
int dis[MAXN];

bool bellman_ford(){
	int flag = false;
//	dis[1] = 0;
	for(int i = 1; i <= n; ++i){
		flag = false;
		for(int j = 1; j <= len; ++j){
			int x = e[j].x, y = e[j].y, z = e[j].z;
			if(dis[y] > dis[x] + z){
				dis[y] = dis[x] + z;
				flag = true;
			} 
		}
		if(!flag) return false;
	}
	return true;
}

void clearr(){
	memset(lin,0,sizeof(lin));
	memset(dis,INF,sizeof(dis));
	len = 0;
}
int main()
{
	int t;
	scanf("%d",&t);
	while(t--){
		clearr();
		scanf("%d%d%d",&n,&m,&w);
		for(int i = 1; i <= m; ++i){
			int x,y,z;
			scanf("%d%d%d",&x,&y,&z);
			addedge(x,y,z);addedge(y,x,z);
		}
		for(int i = 1; i <= w; ++i){
			int x,y,z;
			scanf("%d%d%d",&x,&y,&z);
			addedge(x,y,-z);
		}
		if(bellman_ford()) printf("YES\n");
		else printf("NO\n");
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/BIGBIGPPT/article/details/87904992
今日推荐