zstu校赛4191——DFS——无向图找环

Description

 给你一副无向图,每条边有边权,保证图联通,现在让你判断这个图是否有异或值大于零的环存在。

 

Input

 多组测试数据,每组先输入两个数n m,表示图的点跟边的数量。

然后是m行,每行三个数a b c。代表一条边的起点,终点,边权。

1 <= n<= 100000, 1 <= m <= 200000.

1 <= a <= n, 1 <= b <= n, a != b.

0 <= c <= 32767

Output

 对于每组数据输出Yes或者 No。

Sample Input

3 3
1 2 0
2 3 1
3 1 1

Sample Output

No

HINT

 

Source

Wuyiqi

大意:用邻接表+DFS,异或环就是这个环里的所有值的异或sum

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int MAX1 = 400100,MAX = 400100;
struct edge{
    int u, v, w, nxt;
}a[MAX];
int head[MAX],sumxor[MAX1];
int vis[MAX1];
int n,m,E;
int u,v,w;
int flag ;
void add(int u,int v,int w){
    a[E].u = u;a[E].v = v;a[E].w = w;a[E].nxt = head[u];
    head[u] = E++;
    a[E].u = v;a[E].v = u;a[E].w = w;a[E].nxt = head[v];
    head[v] = E++;
}
void dfs(int u)
{
    for(int i = head[u]; i != -1; i = a[i].nxt){
        if(!vis[a[i].v]){
            vis[a[i].v] = 1;
            sumxor[a[i].v] = sumxor[u]^a[i].w;
            dfs(a[i].v);
        }
        else {
            if(sumxor[a[i].v]^sumxor[u]^a[i].w){
                flag = 1;
            return ;
            }
        }
    }
}
int main(){
 while(~scanf("%d%d",&n,&m)){
     E = 0;
     flag = 0;
     fill(head,head+n+1,-1);
     fill(vis,vis+n+1,0);
     vis[1] = 1;
     sumxor[1] = 0;
     while(m--){
      scanf("%d%d%d",&u,&v,&w);
      add(u,v,w);
     }
     dfs(1);
    if(flag == 1)
        printf("Yes
");
    else printf("No
");
    }
 return 0;
}
View Code
原文地址:https://www.cnblogs.com/zero-begin/p/4437861.html