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\n");

    else printf("No\n");

    }

 return 0;

}
View Code

 

你可能感兴趣的:(DFS)