11.12 T3

http://codevs.cn/problem/5570/

题面   ↑   自己拿

题意:多组数据,每组数据给你一个双向图,让你找如果图中的圈的异或和为零,则输出”Yes“,否则输出”No“,做法的话跑一边dfs然后每扩展一个节点然后求一下异或和,如果将要扩展的节点已经被访问过,则说明找到一个圈,然后记录一个异或和即可。(有向图叫环,无向图叫圈?应该只这样吧)

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n,m;
struct ha
{
	int f,t,d;
}es[1000];
int tot=0,first[1000],next[1000],dis[1000];
void build(int f,int t,int d)
{
	es[++tot]=(ha){f,t,d};
	next[tot]=first[f];
	first[f]=tot;
}
bool vis[1000];
int h=0;
void dfs(int x)
{
	for(int i=first[x];i!=0;i=next[i])
	{
		int v=es[i].t;
		if(vis[v]==0)
		{
			vis[v]=1;
			dis[v]=(dis[x]^es[i].d);
			dfs(v);
		}
		else 
		{
			int p=(dis[x]^es[i].d);
			if(p!=dis[v])
			{
				h=1;
				return ;
			}
		}
	}
	
}
void init()
{
	tot=0;h=0;
	memset(first,0,sizeof(first));
	memset(next,0,sizeof(next));
	memset(vis,0,sizeof(vis));
	memset(dis,0,sizeof(dis));
	memset(es,0,sizeof(es));	
}
int main()
{
	int T;
	scanf("%d",&T);
	while (T!=0)
	{
		T--;
		init();
		scanf("%d%d",&n,&m);
		for(int i=1;i<=m;i++)
		{
			
			int x,y,z;
			scanf("%d%d%d",&x,&y,&z);
			build(x,y,z);
			build(y,x,z);
		}
		for(int i=1;i<=n;i++)
		{
			if(vis[i]==0) dfs(i);
			if(h==1)break;
		}
		if(h==1) puts("No");
		else 
		puts("Yes");
	}
	
	
	return 0;
}

 

转载于:https://my.oschina.net/u/3009052/blog/787779

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值