前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >POJ 3259 Wormholes(spfa判负环)

POJ 3259 Wormholes(spfa判负环)

作者头像
Ch_Zaqdt
发布2019-01-10 16:50:21
7390
发布2019-01-10 16:50:21
举报
文章被收录于专栏:Zaqdt_ACMZaqdt_ACM

题目链接:http://poj.org/problem?id=3259

       题意是有n个点,m条边,k个虫洞(权值为负),输入完m条无向边后输入k条有向边,问能不能找到一个点,从这个点出发,最后回到这个点的时候权值是负的(时光倒流)。

       首先这个可以用Floyd去跑一遍,然后遍历每个点看看有没有能得到负权的点,想看Floyd做法的可以看看这篇博客:POJ 3259 Wormholes(Floyd判负环),这篇博客是用spfa去跑的,从一个点出发,我们只需要看在这个图中有没有负环存在(就是一个环的权值和为负的),如果有的话,我们就可以以这个负环中的任意一点为起点,最终回来的时候就可以得到负的权值了。


AC代码:

代码语言:javascript
复制
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#define maxn 505
#define inf 0x3f3f3f3f
using namespace std;
struct Node{
	int to,w,next;
	bool operator < (const Node &a) const{
		return a.w < w;
	}
}Edge[maxn * maxn];
int head[maxn * maxn],num;
int dist[maxn];
bool vis[maxn];
int T,n,m,k;

void init(){
	memset(head,-1,sizeof(head));
	num = 0;
}

void add(int u,int v,int w){
	Edge[num].w = w;
	Edge[num].to = v;
	Edge[num].next = head[u];
	head[u] = num ++;
}

bool spfa(){
	int cnt[maxn];
	memset(cnt,0,sizeof(cnt));
	memset(dist,inf,sizeof(dist));
	memset(vis,false,sizeof(vis));
	dist[1] = 0;
	cnt[1] = 1;
	queue<int> q;
	q.push(1);
	while(!q.empty()){
		int u = q.front();
		q.pop();
		vis[u] = false;
		for(int i=head[u];i!=-1;i=Edge[i].next){
			int v = Edge[i].to;
			if(dist[v] > dist[u] + Edge[i].w){
				dist[v] = dist[u] + Edge[i].w;
				if(vis[v] == false){
					cnt[v]++;
					q.push(v);
					vis[v] = true;
					if(cnt[v] >= n){
						return true;
					}
				}
			}
		}
	}
	return false;
}

int main()
{
	scanf("%d",&T);
	while(T--){
		init();
		scanf("%d%d%d",&n,&m,&k);
		for(int i=0;i<m;i++){
			int u,v,w;
			scanf("%d%d%d",&u,&v,&w);
			add(u, v, w);
			add(v, u, w);
		}
		for(int i=0;i<k;i++){
			int u,v,w;
			scanf("%d%d%d",&u,&v,&w);
			add(u, v, -w);
		}
		if(spfa()){
			puts("YES");
		}
		else{
			puts("NO");
		}
	}
	return 0;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年10月25日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档