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;
}