◆HDU-5215◆ Cycle

国庆节集训的第三天……讲图论,心情愉快……刷了一堆水题,不过也刷了一些有意思的题

+传送门+ HDU


▶ 题目

给出一个无向图(无自环,无重边),求该无向图中是否存在奇环、偶环。

多组数据,每组数据第一行为n,m表示点和边的数量,接下来m行每行描述一条边。

对于每组数据,输出两行,第一行输出是否存在奇环,第二行输出是否存在偶环。


▶ 解析

因为是一个简单图,这道题就简单了很多。

(1)判断奇环

有一类图是不包含奇数环的——二分图,反过来也是这样——二分图是不包含奇数环的图,所以不是二分图的图就一定包含奇数图。我们就只需要判断原图是否是二分图即可~ 黑白染色判断二分图就可以了。

(2)判断偶环

重点和难点基本上就在这儿了。

我们知道对于每一个连通块我们可以生成一棵DFS树,树上存在树边和返祖边(对这方面知识不熟的reader们建议先学了DFS树再看)。而一些树边和一条返祖边就会构成一个环——如果一条返祖边的两端点在DFS树上的路径距离为奇数,那么加上返祖边就形成了一个偶环。

当然形成偶环也不止这一个情况——看下面两种:

所以总结一下——另一种情况,存在两组点(a,b)(c,d),a与b、c与d在树上的距离都为偶数(如果为奇数的话加上一条返祖边就可以直接形成偶数环了),且a->b和c->d的路径相交(点相交即可),那么就存在偶环,即路径2+路径3。

如上图所示,两个返祖边的端点之间的树边有交集 路径1 ,所以它们可以形成偶数环。

(3)具体实现

听起来像需要2次DFS,但是其实只需要一次——DFS可以同时实现判断二分图和树边、返祖边。

由于可能存在多个连通块,所以依次枚举起点u,如果u没有访问过,则从u开始遍历连通块,同时将u先染色。

若当前在节点u,则通过邻接表遍历u的儿子v,注意枚举v时要将v到达u的父亲的情况舍去。若发现v没有被遍历过,则将v染色后继续从v点遍历;否则经过了一条返祖边,判断v的颜色:

① col[v] ≠ col[u] : 则u->v的路径为奇数,二分图染色成功,存在偶环;

② col[v] = col[u] : 则u->v的理解为偶数,存在奇环;遍历u->v的路径,如果路径上有点已经被打上标记,则说明有另外一条返祖边的两端点之间的路径与当前u->v的路径相交,存在偶环,否则将 u->v 的路径上的点全部打上标记;

输出即可。


▶ 源代码

 /*Lucky_Glass*/
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int N=int(1e5);
int n,m;
vector<int> lnk[N+];
int col[N+],fa[N+],dep[N+];
bool cov[N+];
bool odd,eve;
void DFS(int u,int pre){
for(int i=;i<(int)lnk[u].size();i++){
int v=lnk[u][i];
if(v==pre) continue;
if(col[v]==-){
col[v]=!col[u];
fa[v]=u;
dep[v]=dep[u]+;
DFS(v,u);
}
else{
if(col[v]==col[u]){
odd=true;
if(dep[v]>dep[u]) continue; //upd. 每条返祖边只能走一次!
if(cov[v]) eve=true;
else cov[v]=true;
int pnt=u;
while(!eve){
if(cov[pnt]) eve=true;
cov[pnt]=true;
pnt=fa[pnt];
if(pnt==v || pnt==-) break;
}
}
else eve=true;
}
}
}
void Clear(){
memset(cov,false,sizeof cov);
memset(fa,-,sizeof fa);
memset(lnk,,sizeof lnk);
memset(col,-,sizeof col);
memset(dep,,sizeof dep);
odd=eve=false;
}
int main(){
int T;scanf("%d",&T);
while(T--){
Clear();
scanf("%d%d",&n,&m);
for(int i=;i<m;i++){
int u,v;
scanf("%d%d",&u,&v);
lnk[u].push_back(v);
lnk[v].push_back(u);
}
for(int i=;i<=n;i++)
if(col[i]==-){
col[i]=;
dep[i]=;
DFS(i,-);
}
printf("%s\n%s\n",odd?"YES":"NO",eve?"YES":"NO");
}
return ;
}

  


The End

Thanks for reading!

- Lucky_Glass

(Tab:如果我有没讲清楚的地方可以直接在邮箱lucky_glass@foxmail.com email我,在周末我会尽量解答并完善博客~

【杂题总汇】HDU-5215 Cycle的更多相关文章

  1. 【杂题总汇】HDU多校赛第十场 Videos

    [HDU2018多校赛第十场]Videos 最后一场比赛也结束了…… +HDU传送门+ ◇ 题目 <简要翻译> 有n个人以及m部电影,每个人都有一个快乐值.每场电影都有它的开始.结束时间和 ...

  2. 【杂题总汇】AGC027 C - ABland Yard

    ◆AGC027◆C - ABland Yard 终于知道为什么比赛的时候这么多人做C题了…… +传送门+(这是beta版的) ◇ 题目(自己翻译的,不要在意细节……) P.S. (@ 2018-9-2 ...

  3. 【杂题总汇】Codeforces-67A Partial Teacher

    [Codeforces-67A]Partial Teacher 上周刷了一大堆小紫薯的动态规划的题

  4. 【杂题总汇】NOIP2013(洛谷P1967) 货车运输

    [洛谷P1967] 货车运输 重做NOIP提高组ing... +传送门-洛谷P1967+ ◇ 题目(copy from 洛谷) 题目描述 A国有n座城市,编号从1到n,城市之间有m条双向道路.每一条道 ...

  5. 【杂题总汇】UVa-1336 Fixing the Great Wall

    [UVA-1336]Fixing the Great Wall 一开始把题看错了……直接用的整数存储答案:之后用double存最后输出答案的时候取整就AC了

  6. 【杂题总汇】HDU-6406 Taotao Picks Apples

    [HDU 6406]Taotao Picks Apples 多校赛的时候多写了一行代码就WA了……找了正解对拍,在比赛结束后17分钟AC了

  7. HDU.5215.Cycle(判环)

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

  8. hdu 5215 Cycle

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

  9. HDU 5215 Cycle(dfs判环)

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

随机推荐

  1. Csharp: FreeTextbox 编辑器控件运行时错误: 'FTB_ResizeGalleryArea' 未定义

    ftb.imagegallery.aspx 改一下代码: <form id="Form1" runat="server" enctype="mu ...

  2. CSS深入理解学习笔记之border

    1.border-width border-width为何不支持百分比:语义和使用场景决定的,现实中各种边框本身的概念就不存在百分比的使用方法. border-width支持关键字:thin.medi ...

  3. 使用HTML5 canvas做地图(2)瓦片以及如何计算的

    上一篇也说到瓦片,我们为什么使用瓦片?这一篇主要是关于如何拼接地图? 下面的一张图,可以一眼明了,地图是如何切割以及拼接的. 瓦片信息 瓦片信息包括切图原点,瓦片大小,格式,分辨率以及分辨率级别等. ...

  4. 一個新的面試題目,leetcode上面可以找到shortest palindrome

    記錄一下新的面試題目,其實題目是舊的,只是我才見到.以前研究過,只不過以前的解法不容易理解,現在有了新的遞歸解法.記錄一下. public String shortestPalindrome(Stri ...

  5. Windows快捷操作技巧

    隐藏技能 在当前路径打开命令行 shift + 右键点击文件夹内的空白处,你会看到右键弹出菜单多了个选项 "在此处打开命令窗口",省去了打开命令行再cd到当前路径的麻烦. 快捷键 ...

  6. 基于alpine定制常用命令镜像

    FROM alpine RUN apk update RUN apk add curl coreutils 像busybox.alpine镜像date命令都不是完整版的,不能执行加减的操作(date ...

  7. Excel-怎样实现行列转置

    有时候,我们为了某些需要,必须把工作表的行列进行转置的方式显示.重新输入很浪费时间,怎样简单的实现转置呢,强大的excel2007提供了此项功能,具体怎么做,下面看我来演示一下. 工具/原料   装有 ...

  8. SAP成都研究院廖婧:SAP C4C社交媒体集成概述

    曾经有朋友在知乎上向我提问,咨询在SAP成都研究院工作的体验. 当时,我的回答提到一点,SAP注重工作与生活的平衡,这也是SAP中国官网强调的一点. https://www.sap.com/china ...

  9. 在Kubernetes上运行SAP UI5应用(上)

    2018年只剩最后30天了.Jerry在2017年的最后一天,曾经立下一个目标:这个微信公众号在2018年保证至少每周发布一篇SAP原创技术文章. 从Jerry在后台统计的2018全年文章数量来看,这 ...

  10. SAP+DB2 糟糕的报表查询『ZCOR0015』 优化全程记录

    ZCOR0015的优化全过程记录文档 2015年3月,今天无意翻到这篇写于2010年7月的文档,回想那时的工作,毕业3年初出茅庐的我面对接触不多的SAP+DB2竟敢操刀动斧,自信满满. 虽然这过程一路 ...