zstu.4191: 无向图找环(dfs树 + 邻接表)

4191: 无向图找环

Time Limit: 5 Sec  Memory Limit: 128 MB Submit: 117  Solved: 34

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

 1 #include<cstdio>
 2 #include<map>
 3 using namespace std;
 4 const int N = 100000 + 10 , M =  200000 + 10 ;
 5 struct edge
 6 {
 7     int u , v , nxt ;
 8     int w ;
 9 }e[M * 2];
10 int head[M * 2] , E = 0 ;
11 bool vis [N] ;
12 int sumxor[N] ;
13 int n , m ;
14 int u , v , w ;
15 bool flag ;
16
17 void add (int u , int v , int w)
18 {
19     e[E].u = u , e[E].v = v , e[E].w = w , e[E].nxt = head[u] ;
20     head[u] = E ++ ;
21     e[E].u = v , e[E].v = u , e[E].w = w , e[E].nxt = head[v] ;
22     head[v] = E ++ ;
23 }
24
25 void dfs (int u)
26 {
27     for (int i = head[u] ; i != -1 ; i = e[i].nxt) {
28         if (! vis[e[i].v]) {
29             vis[e[i].v] = 1 ;
30             sumxor[e[i].v] = sumxor[u] ^ e[i].w ;
31             dfs (e[i].v) ;
32         }
33         else {
34             if ( (sumxor[e[i].v] ^ sumxor[u] ^ e[i].w) ) {
35                 flag = 1 ;
36                 return ;
37             }
38         }
39     }
40 }
41
42 int main ()
43 {
44     //freopen ("a.txt" , "r" , stdin ) ;
45     while (~ scanf ("%d%d" , &n , &m) ) {
46         E = 0 ;
47         flag = 0 ;
48         fill (head , head + n + 1 , -1 ) ;
49         while (m --) {
50             scanf ("%d%d%d" , &u , &v , &w) ;
51             add (u , v , w) ;
52         }
53         fill (vis , vis + n + 1 , 0) ;
54         vis[1] = 1 ;
55         sumxor[1] = 0 ;
56         dfs (1) ;
57         printf ("%s\n" , flag ? "Yes" : "No" ) ;
58     }
59     return 0 ;
60 }

dfs树:
只要在ADG中进行广搜,只要有祖先和儿子这种关系,那么他们就能构成环;反之若 任意 一对节点不符合这个原则,就不能构成环。(简单来说你能搜到就能成环)

此外nxt 存放的是 “边”。

因为用dfs找点只需 n 次 , 而用了邻接表找边 只需 m 次。

所以总的复杂度为O(n + m)。

时间: 2024-11-10 20:33:02

zstu.4191: 无向图找环(dfs树 + 邻接表)的相关文章

ZSTUOJ 4191 无向图找环(dfs)

中文题 直接dfs下去即可,遇到重复访问的点,判断一下该环三部分异或和是否大于0 代码: #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N = 100005; const int M = 400005; int n, m; struct Edge { int u, v, w; Edge() {} Edge(int u, int v, int

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 对于每组数据

ZSTU OJ 3999 零基础学算法---邻接表

题目:Click here 题意:我就喜欢中文题! 分析:这个题虽然是中文题,但是还是有一点费解的.其实就是给你一棵树,是用图的形式给你的,只知道a,b之间有一条边,并不知道谁是父,谁是子.思路就是先把这个无向图用邻接表存下来,再转成有向图,最后dfs回答每一条询问.(的确有点麻烦,并且这次使用vector实现的邻接表,学长教的有点难懂,近期更新上来) 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring&

poj-3321-dfs序-线段树-邻接表

思路:用邻接表存图,卡vector[这里被卡哭了QAQ],用dfs遍历的顺序重新给节点编号,遍历时记录儿子数目.用dfs序建立线段树,change的时候单点更新,查询某子树上的苹果树即是查询该节点[i, i+childnum]这个区间的苹果数目,i指dfs序. 总结:邻接表出边入边傻傻搞不清楚QAQ AC代码: 1 #include <iostream> 2 #include <cstdio> 3 #include <vector> 4 #include <cst

CodeForces 510B 无向图找环的两种方法(搜索与并查集)

题目连接:http://codeforces.com/problemset/problem/510/B 解法: dfs 每次把父节点的值记录并传递下去,判断一下新达到节点: (1)没有走过 → 继续搜索: (2)走过&&不是父节点(对于本题步数也要>=4) → 找到环: 并查集 每个节点映射成 i*m+j从起点开始分别把它下面与于右面的节点加进来,如果发现有节点已经在集合中,那么环已经找到了. DFS: #include<cstdio> #include<cstdl

hdu 6041 I Curse Myself 无向图找环+优先队列

I Curse Myself Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Problem Description There is a connected undirected graph with weights on its edges. It is guaranteed that each edge appears in at most one simple cy

邻接表无向图(一)之 C语言详解

本章介绍邻接表无向图.在"图的理论基础"中已经对图进行了理论介绍,这里就不再对图的概念进行重复说明了.和以往一样,本文会先给出C语言的实现:后续再分别给出C++和Java版本的实现.实现的语言虽不同,但是原理如出一辙,选择其中之一进行了解即可.若文章有错误或不足的地方,请不吝指出! 目录 1. 邻接表无向图的介绍 2. 邻接表无向图的代码说明 3. 邻接表无向图的完整源码 转载请注明出处:http://www.cnblogs.com/skywang12345/ 更多内容:数据结构与算法

邻接表无向图(二)之 C++详解

本章是通过C++实现邻接表无向图. 目录 1. 邻接表无向图的介绍 2. 邻接表无向图的代码说明 3. 邻接表无向图的完整源码 转载请注明出处:http://www.cnblogs.com/skywang12345/ 更多内容:数据结构与算法系列 目录 邻接表无向图的介绍 邻接表无向图是指通过邻接表表示的无向图. 上面的图G1包含了"A,B,C,D,E,F,G"共7个顶点,而且包含了"(A,C),(A,D),(A,F),(B,C),(C,D),(E,G),(F,G)"

邻接表无向图(三)之 Java详解

前面分别介绍了邻接表无向图的C和C++实现,本文通过Java实现邻接表无向图. 目录 1. 邻接表无向图的介绍 2. 邻接表无向图的代码说明 3. 邻接表无向图的完整源码 转载请注明出处:http://www.cnblogs.com/skywang12345/ 更多内容:数据结构与算法系列 目录 邻接表无向图的介绍 邻接表无向图是指通过邻接表表示的无向图. 上面的图G1包含了"A,B,C,D,E,F,G"共7个顶点,而且包含了"(A,C),(A,D),(A,F),(B,C),