1. 程式人生 > >洛谷——P3907 圈的異或

洛谷——P3907 圈的異或

P3907 圈的異或

 

無向圖$dfs$找環,並判斷邊權異或和是否為0

 

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>

#define N 100000
using namespace std;

int head[N],tot;
struct node{
    int to,next,w;
}e[N];

bool vis[N],bvis[N];
int t,n,m;

void add(int
u,int v,int w){ e[++tot].to=v,e[tot].next=head[u],head[u]=tot,e[tot].w=w; } bool flg; int orx[N]; bool dfs(int u,int fa,int w){ vis[u]=true,orx[u]=w; for(int i=head[u];i;i=e[i].next){ int v=e[i].to; if(v==fa) continue; if(vis[v]){ if(orx[u]^orx[v]^e[i].w) return
true; continue; } if(dfs(v,u,w^e[i].w)) return true; } return false; } int main() { scanf("%d",&t); while(t--){ memset(vis,0,sizeof(vis)); memset(bvis,0,sizeof(bvis)); memset(head,0,sizeof(head)); memset(e,
0,sizeof(e)); tot=1; scanf("%d%d",&n,&m); for(int u,v,w,i=1;i<=m;i++){ scanf("%d%d%d",&u,&v,&w); add(u,v,w),add(v,u,w); } flg=false; for(int i=1;i<=n;i++){ if(!vis[i]&&!flg) flg|=dfs(i,0,0); } if(flg) printf("No\n"); else printf("Yes\n"); } return 0; }