HDU-5215 Cycle 无向图判奇环偶环
题意:给一个无向图,判断这个图是否存在奇环和偶环。
解法:网上有一种只用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 无向图判奇环偶环的更多相关文章
- HDU 5215 Cycle(dfs判环)
题意 题目链接 \(T\)组数据,给出\(n\)个点\(m\)条边的无向图,问是否存在一个奇环/偶环 Sol 奇环比较好判断吧,直接判是否是二分图就行了.. 偶环看起来很显然就是如果dfs到一个和他颜 ...
- hdu 5215 Cycle
题意:找到一个图中是否含有奇环和偶环 题解: 1.用了两种发法.一个就是跟bc给的答案一样,先求弱联通分量.再在环中找奇偶环 2.我想到的一个略微省些代码量的方法.边求联通分量,边推断是否含有奇环偶环 ...
- HDU.5215.Cycle(判环)
题目链接 \(Description\) 给定\(n\)个点\(m\)条边的无向图,问是否存在一个长度为奇数/偶数的简单环. \(n\leq 10^5,m\leq 3\times 10^5\). \( ...
- HDU - 3478 Catch(判奇环/二分图)
http://acm.hdu.edu.cn/showproblem.php?pid=3478 题意 给一个无向图和小偷的起点,小偷每秒可以向相邻的点出发,问有没有一个时间点小偷可能出现在任何点. 分析 ...
- HDU 5215 BestCoder"杯中国大学生程序设计冠军赛” 边双连通分量取出子图+二分染色判图内奇偶环
Cycle Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)Total Sub ...
- HDU3478 【判奇环/二分图的性质】
题意: 给你一幅图,给你一个起点,然后问你存不存在一个时刻,所有点可以在那个时刻到达. 思路: 这幅图首先是联通的: 如果出现奇数环,则满足在某一时刻都可能到达: 然后判断奇数环用二分图性质搞也是神奇 ...
- 【POJ 2942】Knights of the Round Table(双联通分量+染色判奇环)
[POJ 2942]Knights of the Round Table(双联通分量+染色判奇环) Time Limit: 7000MS Memory Limit: 65536K Total Su ...
- POJ 2240 Arbitrage / ZOJ 1092 Arbitrage / HDU 1217 Arbitrage / SPOJ Arbitrage(图论,环)
POJ 2240 Arbitrage / ZOJ 1092 Arbitrage / HDU 1217 Arbitrage / SPOJ Arbitrage(图论,环) Description Arbi ...
- js实现四舍六入 奇进偶舍
function PointFloat(src, pos) { return Math.round(src * Math.pow(10, pos)) / Math.pow(10, pos); } // ...
随机推荐
- lsyncd+rsync文件实时同步
1.rsync两端都需要安装 yum -y install rsync 2.提供lsyncd的安装源 rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x ...
- pipeline语法之判断一个文件存在与否
先看一个例子,原理,根据命令返回的状态值来判断它的存在与否 pipeline { agent any stages { stage("check file if exists"){ ...
- Spring MVC processing flow
原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11484057.html DispatcherServlet receives the request. ...
- mitmproxy 代理介绍及入门
转载请注明出处 https://www.cnblogs.com/majianming/p/11823669.html mitmproxy 是一个python 写成的代理工具,可以代理https.htt ...
- Linux eth0, eth1, ..., eth%d 的生成【转】
转自:https://blog.csdn.net/xiruanliuwei/article/details/78765255 一直很好奇,Linux下的eth0, eth1,eth2等是如何生成的~ ...
- Linux文件归档工具——cpio
一cpio的介绍 功能:复制文件从或到归档 cpio命令是通过重定向的方式将文件进行打包备份,还原恢复的工具,它可以解压以“.cpio”或者“.tar”结尾的文件. cpio [选项] > 文件 ...
- 最佳实践 | RDS & POLARDB归档到X-Pack Spark计算
X-Pack Spark服务通过外部计算资源的方式,为Redis.Cassandra.MongoDB.HBase.RDS存储服务提供复杂分析.流式处理及入库.机器学习的能力,从而更好的解决用户数据处理 ...
- 威胁快报|Bulehero挖矿蠕虫升级,PhpStudy后门漏洞加入武器库
概述 近日,阿里云安全团队监控到Bulehero挖矿蠕虫进行了版本升级,蠕虫升级后开始利用最新出现的PHPStudy后门漏洞作为新的攻击方式对Windows主机进行攻击,攻击成功后会下载门罗币挖矿程序 ...
- oracle查看数据库版本和字符集
以下以oralce为例, 查看数据库版本? 可以在pl/sql上执行:select * from v$version; 查看字符集? select * from v$nls_parameters; s ...
- css float 浮动
CSS Float(浮动) 什么是 CSS Float(浮动)?大理石平台价格 CSS 的 Float(浮动),会使元素向左或向右移动,其周围的元素也会重新排列. Float(浮动),往往是用于图像, ...