POJ 3259 Wormholes 解题报告

24 篇文章 0 订阅
11 篇文章 0 订阅

Qusetion Link

Problem analysising

Just try to find the negative edge.

Here are AC code (Bellman-Ford)

#include<iostream>
#include<queue>
#include<cstring>
#include<string>
#include<sstream>
#include<map>
#include<vector>
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<stack>
#include<ctime>
using namespace std; 
#define rep(i,aa,bb) for(register int i=aa;i<=bb;i++)
#define rrep(i,aa,bb) for(register int i=aa;i>=bb;i--)
#define mset(var,val)	 memset(var,val,sizeof(var))
#define LL long long 
#define eps 0.000001
#define inf 0x3f3f3f3f
#define llinf 1e18
#define exp 0.000001
#define pai 3.141592654
#define random(x)   rand()%(x)
#define lowbit(x)   x&(-x)
inline int read()
{
	int x=0,y=1;char a=getchar();while ( a>'9' || a<'0'){if ( a=='-')y=-1;a=getchar();}
	while ( a>='0' && a<='9' ){	x=(x<<3)+(x<<1)+a-'0'; a=getchar();}return x*y;
}
#define N 509
struct node{
	int u,v,w; 
}e[N*N];int tot = 0; int n,m,w;int dis[N];
void add_ead(int u,int v,int w){
	++tot; 
	e[tot].u = u; e[tot].v = v; e[tot].w = w; 
}
void init(){
	mset(dis,0x3f);
	tot = 0; 
}
bool bel(){
	dis[1] = 0;
	for (int ai = 1; ai <= n-1; ai++){
		for (int bi = 1; bi <= tot; bi++){
			int u,v,w; 
			u = e[bi].u ; v = e[bi].v ; w = e[bi].w; 
			if ( dis[v] > dis[u] + w )
				dis[v] = dis[u] + w; 
		}
	}
	for (int bi = 1; bi <= tot; bi++){
		if ( dis[ e[bi].v ] > dis[ e[bi].u ] + e[bi].w )
			return 1; 
	}
	return 0; 
}
int main()
{
//	freopen("1.txt","r",stdin);
	srand((int)time(0));
//	std::ios::sync_with_stdio(false);
	int T; T = read();
	rep(aaai,1,T){
		init();
		n = read(); m = read(); w = read();
		rep(i,1,m){
			int u,v,w; 
			u = read(); v = read(); w = read();
			add_ead(u,v,w);
			add_ead(v,u,w);
		}
		rep(i,1,w){
			int u,v,w; 
			u = read(); v = read(); w = read();
			add_ead(u,v,-w);			
		}
		if ( bel() )
			printf("YES\n");
		else 
			printf("NO\n");	
	}
	return 0;
}

What is more

You can use a bool variable to accelerate the program.

bool bel(){
	dis[1] = 0;
	bool check = 0; 
	for (int ai = 1; ai <= n-1; ai++){
		check = 0; 
		for (int bi = 1; bi <= tot; bi++){
			int u,v,w; 
			u = e[bi].u ; v = e[bi].v ; w = e[bi].w; 
			if ( dis[v] > dis[u] + w )
				dis[v] = dis[u] + w, check = 1; 
		}
		if ( !check )
			break; 
	}
	for (int bi = 1; bi <= tot; bi++){
		if ( dis[ e[bi].v ] > dis[ e[bi].u ] + e[bi].w )
			return 1; 
	}
	return 0; 
}

Here are AC code (SPFA)

#include<iostream>
#include<queue>
#include<cstring>
#include<string>
#include<sstream>
#include<map>
#include<vector>
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<stack>
#include<ctime>
using namespace std; 
#define rep(i,aa,bb) for(register int i=aa;i<=bb;i++)
#define rrep(i,aa,bb) for(register int i=aa;i>=bb;i--)
#define mset(var,val)	 memset(var,val,sizeof(var))
#define LL long long 
#define eps 0.000001
#define inf 0x3f3f3f3f
#define llinf 1e18
#define exp 0.000001
#define pai 3.141592654
#define random(x)   rand()%(x)
#define lowbit(x)   x&(-x)
inline int read()
{
	int x=0,y=1;char a=getchar();while ( a>'9' || a<'0'){if ( a=='-')y=-1;a=getchar();}
	while ( a>='0' && a<='9' ){	x=(x<<3)+(x<<1)+a-'0'; a=getchar();}return x*y;
}
#define N 509
struct node{
	int u,v,w,nx; 
}e[N*N];int tot = 0; int n,m,w;int dis[N],hea[N],num[N];bool inq[N];
void add_ead(int u,int v,int w){
	++tot; 
	e[tot].u = u; e[tot].v = v; e[tot].w = w; e[tot].nx = hea[u]; hea[u] = tot; 
}
void init(){
	mset(dis,0x3f);
	mset(hea,0);mset(num,0);
	mset(inq,0);
	tot = 0; 
}
bool SPFA(){
	queue< int > q; 
	dis[1] = 0;	inq[1] = 1; num[1]++;
	q.push(1);
	while ( !q.empty() ){
		int u = q.front(); 	q.pop(); inq[u] = 0;
		for (int i = hea[u] ; i ;i = e[i].nx ){
			if ( dis[ e[i].v ] > dis[ e[i].u ] + e[i].w ){
				dis[ e[i].v ] = dis[ e[i].u ] + e[i].w;
				if ( inq[ e[i].v ] == 0 ){
					inq[ e[i].v ] = 1; 
					num[ e[i].v ]++;
					q.push( e[i].v );
					if ( num[ e[i].v ] > n  )
						return true; 
				}
			}
		}
	}
	return false; 
}
int main()
{
//	freopen("1.txt","r",stdin);
	srand((int)time(0));
//	std::ios::sync_with_stdio(false);
	int T; T = read();
	rep(aaai,1,T){
		init();
		n = read(); m = read(); w = read();
		rep(i,1,m){
			int u,v,w; 
			u = read(); v = read(); w = read();
			add_ead(u,v,w);
			add_ead(v,u,w);
		}
		rep(i,1,w){
			int u,v,w; 
			u = read(); v = read(); w = read();
			add_ead(u,v,-w);			
		}
		if ( SPFA() )
			printf("YES\n");
		else 
			printf("NO\n");	
	}
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值