洛谷——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;
}

猜你喜欢

转载自www.cnblogs.com/song-/p/9810875.html