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
大意:用邻接表+DFS,异或环就是这个环里的所有值的异或sum
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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; }