题意:给一个无向图,判断这个图是否存在奇环和偶环。

解法:网上有一种只用dfs就能做的解法,但是我不太理解。

这里用的是比较复杂的。首先奇环很简单可以用二分图染色判断。问题是偶环怎么判断?这里我们想,一旦有两个环共享了一些点,那么这两个环一定能组成一个偶环。

那么我们考虑tarjan找出所有桥删去,那么对于一个边双联通分量,这个边双只要有多于一个环就必定存在偶环。即当且仅当这个边双为一个奇环的情况下才不存在偶环,其他情况都会有偶环。

所以一旦这个边双不是单环,就必定存在偶环。

那么怎么判断这个是不是一单个环呢?点数=边数的时候就是一个单环。

细节详见代码:

#pragma comment(linker,"/STACK:102400000,102400000")
#include<bits/stdc++.h>
using namespace std;
const int N=3e5+;
int n,m,ver,edge,odd,even,col[N];
bool bridge[N]; int cnt=,head[N<<],nxt[N<<],to[N<<];
void add_edge(int x,int y) {
nxt[++cnt]=head[x]; to[cnt]=y; head[x]=cnt;
} int num,low[N],dfn[N];
void tarjan(int x,int in) {
dfn[x]=low[x]=++num;
for (int i=head[x];i;i=nxt[i]) {
int y=to[i];
if (!dfn[y]) {
tarjan(y,i);
low[x]=min(low[x],low[y]); if (low[y]>dfn[x])
bridge[i]=bridge[i^]=;
} else if (i!=(in^))
low[x]=min(low[x],dfn[y]);
}
} void dfs(int x,int fa) {
col[x]=-col[fa]; ver++;
for (int i=head[x];i;i=nxt[i]) {
if (bridge[i]) continue;
int y=to[i]; edge++;
if (y==fa) continue;
if (!col[y]) dfs(y,x);
else if (col[x]==col[y]) odd=; else even=; //染色过程判断奇偶环
}
} int main()
{
int T; cin>>T;
while (T--) {
cin>>n>>m;
cnt=; for (int i=;i<=n;i++) head[i]=;
for (int i=;i<=m;i++) {
int x,y; scanf("%d%d",&x,&y);
add_edge(x,y); add_edge(y,x);
} num=; for (int i=;i<=n;i++) dfn[i]=low[i]=;
for (int i=;i<=n;i++)
if (!dfn[i]) tarjan(i,); //找桥 odd=even=;
for (int i=;i<=n;i++) col[i]=; col[]=;
for (int i=;i<=n;i++)
if (!col[i]) {
ver=; edge=;
dfs(i,);
if (ver> && edge/!=ver) even=; //点数和边数不等,存在偶环
}
printf("%s\n",odd?"YES":"NO");
printf("%s\n",even?"YES":"NO");
for (int i=;i<=cnt;i++) bridge[i]=;
}
return ;
}

HDU-5215 Cycle 无向图判奇环偶环的更多相关文章

  1. HDU 5215 Cycle(dfs判环)

    题意 题目链接 \(T\)组数据,给出\(n\)个点\(m\)条边的无向图,问是否存在一个奇环/偶环 Sol 奇环比较好判断吧,直接判是否是二分图就行了.. 偶环看起来很显然就是如果dfs到一个和他颜 ...

  2. hdu 5215 Cycle

    题意:找到一个图中是否含有奇环和偶环 题解: 1.用了两种发法.一个就是跟bc给的答案一样,先求弱联通分量.再在环中找奇偶环 2.我想到的一个略微省些代码量的方法.边求联通分量,边推断是否含有奇环偶环 ...

  3. HDU.5215.Cycle(判环)

    题目链接 \(Description\) 给定\(n\)个点\(m\)条边的无向图,问是否存在一个长度为奇数/偶数的简单环. \(n\leq 10^5,m\leq 3\times 10^5\). \( ...

  4. HDU - 3478 Catch(判奇环/二分图)

    http://acm.hdu.edu.cn/showproblem.php?pid=3478 题意 给一个无向图和小偷的起点,小偷每秒可以向相邻的点出发,问有没有一个时间点小偷可能出现在任何点. 分析 ...

  5. HDU 5215 BestCoder"杯中国大学生程序设计冠军赛” 边双连通分量取出子图+二分染色判图内奇偶环

    Cycle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Sub ...

  6. HDU3478 【判奇环/二分图的性质】

    题意: 给你一幅图,给你一个起点,然后问你存不存在一个时刻,所有点可以在那个时刻到达. 思路: 这幅图首先是联通的: 如果出现奇数环,则满足在某一时刻都可能到达: 然后判断奇数环用二分图性质搞也是神奇 ...

  7. 【POJ 2942】Knights of the Round Table(双联通分量+染色判奇环)

    [POJ 2942]Knights of the Round Table(双联通分量+染色判奇环) Time Limit: 7000MS   Memory Limit: 65536K Total Su ...

  8. POJ 2240 Arbitrage / ZOJ 1092 Arbitrage / HDU 1217 Arbitrage / SPOJ Arbitrage(图论,环)

    POJ 2240 Arbitrage / ZOJ 1092 Arbitrage / HDU 1217 Arbitrage / SPOJ Arbitrage(图论,环) Description Arbi ...

  9. js实现四舍六入 奇进偶舍

    function PointFloat(src, pos) { return Math.round(src * Math.pow(10, pos)) / Math.pow(10, pos); } // ...

随机推荐

  1. 2018-10-8-如何安装-btsync

    title author date CreateTime categories 如何安装 btsync lindexi 2018-10-8 9:15:6 +0800 2018-2-13 17:23:3 ...

  2. shell位置参数的遍历

  3. The Preliminary Contest for ICPC Asia Nanjing 2019 D. Robots

    题意:给出一个DAG,一只机器人从1点出发,等概率地选择一条出边走或者停留在原点,机器人的第k次行动消耗能量是k(无论是走还是停留都算一次行动).问1到n的期望. 解法:因为行动消耗的能量跟行动次数有 ...

  4. servlet 实践

    基础 当Servlet引擎收到一个请求,它将请求所有的细节汇编到一个HttpServletRequest对象.细节包括请求头部.URI.查询字符串和任意发送的参数等等.类似地,它初始化一个处理响应头部 ...

  5. Retrofit总结(原)

    1.Retrofit的作用 A type-safe HTTP client for Android and Java 看到这句话时候在想什么是类型安全? 百度一下:类型安全代码指访问被授权可以访问的内 ...

  6. JS中的call()和apply()方法(转)

    转自:http://uule.iteye.com/blog/1158829 JS中的call()和apply()方法 博客分类: JS   1.方法定义 call方法: 语法:call([thisOb ...

  7. Python向方法中传递自定义类型参数

    定义类型 class Fish: def __init__(self,x): self.num = xclass Turtle: def __init__(self,y): self.num = yc ...

  8. 解决"Microsoft Visual C++ 14.0 is required"的问题

    1. 在  https://www.lfd.uci.edu/~gohlke/pythonlibs/  上面找到要安装的组件 2.下载相应的版本到本地 3. pip install **.whl

  9. 数据库索引(BTree索引和Hash索引)

    索引 索引是为了方便查找我们所需要的数据. mysql支持的索引数据类型 B-Tree索引的特点 B-Tree索引以B+Tree(树)的结构存储数据. B-Tree索引能够加快数据的查询速度: B-T ...

  10. C#的一些代码

    form读取配置文件 /// <summary> /// 读取配置文件 /// </summary> /// <param name="key"> ...