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
#include<cstdio>
#include<map>
using namespace std;
const int N = + , M = + ;
struct edge
{
int u , v , nxt ;
int w ;
}e[M * ];
int head[M * ] , E = ;
bool vis [N] ;
int sumxor[N] ;
int n , m ;
int u , v , w ;
bool flag ; void add (int u , int v , int w)
{
e[E].u = u , e[E].v = v , e[E].w = w , e[E].nxt = head[u] ;
head[u] = E ++ ;
e[E].u = v , e[E].v = u , e[E].w = w , e[E].nxt = head[v] ;
head[v] = E ++ ;
} void dfs (int u)
{
for (int i = head[u] ; i != - ; i = e[i].nxt) {
if (! vis[e[i].v]) {
vis[e[i].v] = ;
sumxor[e[i].v] = sumxor[u] ^ e[i].w ;
dfs (e[i].v) ;
}
else {
if ( (sumxor[e[i].v] ^ sumxor[u] ^ e[i].w) ) {
flag = ;
return ;
}
}
}
} int main ()
{
//freopen ("a.txt" , "r" , stdin ) ;
while (~ scanf ("%d%d" , &n , &m) ) {
E = ;
flag = ;
fill (head , head + n + , - ) ;
while (m --) {
scanf ("%d%d%d" , &u , &v , &w) ;
add (u , v , w) ;
}
fill (vis , vis + n + , ) ;
vis[] = ;
sumxor[] = ;
dfs () ;
printf ("%s\n" , flag ? "Yes" : "No" ) ;
}
return ;
}
dfs树:
只要在ADG中进行广搜,只要有祖先和对应节点这种关系,那么他们就能构成环;反之若 任意 一对节点不符合这个原则,就不能构成环。(简单来说你能搜到就能成环)
此外nxt 存放的是 “边”。
因为用dfs找点只需 n 次 , 而用了邻接表找边 只需 m 次。
又因为如果两个小环的异或值!= 0 , 那么所形成的的大环的异或值肯定 != 0 ;
所以总的复杂度为O(n + m)。
zstu.4191: 无向图找环(dfs树 + 邻接表)的更多相关文章
- ZSTU OJ 3999 零基础学算法---邻接表
题目:Click here 题意:我就喜欢中文题! 分析:这个题虽然是中文题,但是还是有一点费解的.其实就是给你一棵树,是用图的形式给你的,只知道a,b之间有一条边,并不知道谁是父,谁是子.思路就是先 ...
- hdu 6041 I Curse Myself 无向图找环+优先队列
I Curse Myself Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) ...
- dfs树
dfs树是解决图中带环的利器. 前天CF的F题就是dfs树,但是当时我没有认真思考 觉着找到一个环过于困难 当时没有想到 也没理解dfs树的意义. 对于一张无向图求出一个dfs树 这个树有两种边 树边 ...
- hdu 4707 Pet(DFS && 邻接表)
Pet Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submis ...
- 邻接表无向图(三)之 Java详解
前面分别介绍了邻接表无向图的C和C++实现,本文通过Java实现邻接表无向图. 目录 1. 邻接表无向图的介绍 2. 邻接表无向图的代码说明 3. 邻接表无向图的完整源码 转载请注明出处:http:/ ...
- 邻接表无向图(二)之 C++详解
本章是通过C++实现邻接表无向图. 目录 1. 邻接表无向图的介绍 2. 邻接表无向图的代码说明 3. 邻接表无向图的完整源码 转载请注明出处:http://www.cnblogs.com/skywa ...
- 邻接表无向图(一)之 C语言详解
本章介绍邻接表无向图.在"图的理论基础"中已经对图进行了理论介绍,这里就不再对图的概念进行重复说明了.和以往一样,本文会先给出C语言的实现:后续再分别给出C++和Java版本的实现 ...
- CodeForces - 103B(思维+dfs找环)
题意 https://vjudge.net/problem/CodeForces-103B 很久很久以前的一天,一位美男子来到海边,海上狂风大作.美男子希望在海中找到美人鱼 ,但是很不幸他只找到了章鱼 ...
- 与图论的邂逅06:dfs找环
当我在准备做基环树的题时,经常有了正解的思路确发现不会找环,,,,,,因为我实在太蒻了. 所以我准备梳理一下找环的方法: 有向图 先维护一个栈,把遍历到的节点一个个地入栈.当我们从一个节点x回溯时无非 ...
随机推荐
- Android开发新手第一要素
很多新手开发程序的时候,或者将原来跑在Android 2.X上的程序迁移到Android 3.x以上的时候经常会莫名其妙的出现崩溃(Crash).从我的经验来看,这里可能有很多原因,但是最重要也是最常 ...
- Android响应式界面开发要点
现在很多项目需要到达同一个Apk既可以在Phone上跑也尅在tablet上跑,即界面要适应不同尺寸和类型的需要而自动调整.这个即为响应式设计.在web开发商响应式设计已经是个常谈的内容了,而对于and ...
- 『设计』Laura.Compute 设计思路
前言: 前一篇文章 <『开源』也顺手写一个 科学计算器:重磅开源> ,继 Laura.Compute 算法开源之后,有 博客园 园友 希望公开一下 Laura.Compute算法 的 设计 ...
- 自定义带图片和文字的ImageTextButton
今天我们来讲一下有关自定义控件的问题,今天讲的这篇是从布局自定义开始的,难度不大,一看就明白,估计有的同学或者开发者看了说,这种方式多此一举,但是小编我不这么认为,多一种解决方式,就多一种举一反三的学 ...
- websocket在.net4.5中实现的简单demo
以下代码环境要求:win8或win10, .net4.5+IIS8 win7上是IIS7,win7上.net本身不直接支持websocket, win7可以用superwebsocket, 或自己根据 ...
- abstract和接口
接口只包含常量和抽象方法,不能实例化. abstract: 1.抽象类不能实例化, 2.可以没有抽象方法.但有了抽象方法,一定要被定义为抽象类. 3.子类没有实现父类中所有的抽象方法.子类也必须定义为 ...
- Hibernate-Criteria用法
criteria 英[kraɪˈtɪərɪə] 美[kraɪˈtɪrɪə] Hibernate 设计了 CriteriaSpecification Hibernate 设计了 CriteriaSpec ...
- 43.Android之ListView中BaseAdapter学习
实际开发中个人觉得用的比较多是BaseAdapter,尽管使用起来比其他适配器有些麻烦,但是使用它却能实现很多自己喜欢的列表布局,比如ListView.GridView.Gallery.Spinner ...
- 33.Android之Fragment学习
Fragment Android是在Android 3.0 (API level 11)开始引入Fragment的. 可以把Fragment想成Activity中的模块,这个模块有自己的布局,有自己的 ...
- 【BZOJ-2818】Gcd 线性筛
2818: Gcd Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 3347 Solved: 1479[Submit][Status][Discuss ...