poj3259 luogu2850 虫洞问题

3 篇文章 0 订阅
2 篇文章 0 订阅

理解了很久才知道建立负边判负环

大概是真真正正写的第一道图论题

前前后后写了两课

WA TLE RE CE 全部全了

刚知道poj上不能交万能头文件

luogu过一个点 poj CE

本以为以及注意了赋初值的问题了

事实上考虑的还是不全

赋初值 状态更换 真的特别特别重要

之前写题目

过了样例就很开心

提交之后也只能A一个点

编程真的需要非常缜密的思维

差一点点都不行

暴力写不好真的是有原因的


#include<cmath>  
#include<queue>   
#include<cstdio>  
#include<cstring>  
#include<iostream>  
#include<algorithm> 
#define maxn 501
#define maxm 10005
using namespace std;
template <typename T> void read(T &x){
	x=0;int f=1;char ch=getchar();
	for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1;
	for(;isdigit(ch);ch=getchar())x=(x<<1)+(x<<3)+ch-'0';
	x*=f;
}

int T,n,m,k;

int head[maxn],dis[maxn];
int nxt[maxm],to[maxm],wei[maxm];
bool vis[maxn];
int tim[maxn],Q[maxn*maxn];
int total;

void add(int u,int v,int w){
	++total;
	to[total]=v;
	wei[total]=w;
	nxt[total]=head[u];
	head[u]=total;
}

bool spfa(int x){
	memset(Q,0,sizeof(Q));
	memset(dis,0x7f,sizeof(dis));
	memset(vis,0,sizeof(vis));
	memset(tim,0,sizeof(tim));
	int f=0,t=1;
	Q[1]=x;
	dis[x]=0;
	tim[x]=1;
	while(f<t){
		f++;
		vis[Q[f]]=0;
		for(int e=head[Q[f]];e;e=nxt[e]){
			if(dis[to[e]]>dis[Q[f]]+wei[e]){
				dis[to[e]]=dis[Q[f]]+wei[e];
				if(++tim[to[e]]>n) return true;
				if(!vis[to[e]]){
					++t;
					Q[t]=to[e];
					vis[to[e]]=1;
				}
			}
		}
	}
	return false;
}

int main(){
	read(T);
	while(T--){
		read(n),read(m),read(k);
		total=0;//赋初值 ! 
		memset(head,0,sizeof(head));
		memset(nxt,0,sizeof(nxt));
		memset(wei,0,sizeof(wei));
		memset(to,0,sizeof(to));
		for(int i=1;i<=m;++i){
			int u,v,w;
			read(u),read(v),read(w);
			add(u,v,w);
			add(v,u,w); 
		}
		for(int i=1;i<=k;++i){
			int u,v,w;
			read(u),read(v),read(w);
			add(u,v,-w);
		}
		if(spfa(1)) cout<<"YES"<<endl;
		else cout<<"NO"<<endl;
	} 
 	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值