题目

HDU-5215 Cycle

网上那个啥dfs的垃圾做法随便弄组数据已经hack掉了

做法

纯奇环偶环通过dfs树上,染色判断(由于偶环可能有两个奇环,通过一点相交,dfs树上并不能判完)

两环如果相交必定形成偶环,由于不可以重复经过边,把每个边双提出来判断一下是否存在两个环以上即可

Code

为增加代码的可读性写得比较冗长

#include<bits/stdc++.h>
typedef int LL;
const LL maxn=1e6+9;
inline LL Read(){
LL x(0),f(1); char c=getchar();
while(c<'0' || c>'9'){
if(c=='-') f=-1; c=getchar();
}
while(c>='0' && c<='9'){
x=(x<<3)+(x<<1)+c-'0'; c=getchar();
}return x*f;
}
struct node{
LL to,nxt;
}dis[maxn];
LL n,num,odd,even,tot1,tot2,tim,m,T;
LL head[maxn],cir[maxn],col[maxn],dfn[maxn],low[maxn],visit[maxn];
inline void Add(LL u,LL v){
dis[++num]=(node){v,head[u]}; head[u]=num;
}
void Dfs1(LL u,LL ff){
for(LL i=head[u];i!=-1;i=dis[i].nxt){
LL v(dis[i].to);if(v==ff) continue;
if(!col[v]){
col[v]=3-col[u]; Dfs1(v,u);
}else{
if(col[v]==col[u]) odd=true;
else even=true;
}
}
}
void Dfs2(LL u,LL ff){
dfn[u]=low[u]=++tim;
for(LL i=head[u];i!=-1;i=dis[i].nxt){
LL v(dis[i].to); if(v==ff) continue;
if(!dfn[v]){
Dfs2(v,u); low[u]=std::min(low[v],low[u]);
if(low[v]>dfn[u]){
cir[i]=cir[i^1]=true;
}
}else low[u]=std::min(low[u],dfn[v]);
}
}
void Dfs3(LL u,LL ff){
++tot1; visit[u]=true;
for(LL i=head[u];i!=-1;i=dis[i].nxt){
if(cir[i]) continue;
LL v(dis[i].to); tot2++;
if(v==ff || visit[v]) continue;
Dfs3(v,u);
}
}
int main(){
T=Read();
while(scanf("%d%d",&n,&m)==2){
num=-1;
for(LL i=1;i<=n;++i) head[i]=-1;
for(LL i=1;i<=n;++i) visit[i]=col[i]=dfn[i]=low[i]=0;
for(LL i=0;i<=(m<<1);++i) cir[i]=0;
odd=even=tim=0;
for(LL i=1;i<=m;++i){
LL u(Read()),v(Read());
Add(u,v); Add(v,u);
}
for(LL i=1;i<=m;++i){
if(!dfn[i]) col[i]=1,Dfs1(i,0),Dfs2(i,0);
}
for(LL i=1;i<=n;++i){
if(!visit[i]){
tot1=tot2=0;
Dfs3(i,0);
tot2>>=1;
if(tot1!=1){
if(tot2>tot1) even=true;
}
}
}
if(odd) puts("YES");else puts("NO");
if(even) puts("YES"); else puts("NO");
}
}

HDU-5215 Cycle(边双/判奇偶环)的更多相关文章

  1. HDU.5215.Cycle(判环)

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

  2. UVA11090 Going in Cycle!!(二分判负环)

    UVA11090 Going in Cycle!! 二分答案,用spfa判负环. 注意格式:图不一定连通. 复杂度$O(nmlog(maxw-minw))$ #include<iostream& ...

  3. UVA11090 Going in Cycle (二分+判负环)

    二分法+spfa判负环.如果存在一个环sum(wi)<k*x,i=0,1,2...,k,那么每条边减去x以后会形成负环.因此可用spfa来判负环. 一般spfa判负环dfs最快,用stack次之 ...

  4. hdu 5215 Cycle

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

  5. HDU 5215 Cycle(dfs判环)

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

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

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

  7. UVA 11090 Going in Cycle!!(二分答案+判负环)

    在加权有向图中求平均权值最小的回路. 一上手没有思路,看到“回路”,第一想法就是找连通分量,可又是加权图,没什么好思路,那就转换题意:由求回路权值->判负环,求最小值->常用二分答案. 二 ...

  8. HDU 4514 - 湫湫系列故事——设计风景线 - [并查集判无向图环][树形DP求树的直径]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4514 Time Limit: 6000/3000 MS (Java/Others) Memory Li ...

  9. poj 3259 Wormholes : spfa 双端队列优化 判负环 O(k*E)

    /** problem: http://poj.org/problem?id=3259 spfa判负环: 当有个点被松弛了n次,则这个点必定为负环中的一个点(n为点的个数) spfa双端队列优化: 维 ...

随机推荐

  1. 4.matplotlib绘制直方图

      # coding=utf-8 from matplotlib import pyplot as plt from matplotlib import font_manager a=[131, ...

  2. EF DBFirst 实体生成命令

    dbfirst Entity生成命令行: Scaffold-DbContext "PORT=5435;DATABASE=DocumentDB;HOST=localhost;PASSWORD= ...

  3. 神奇的外部嵌套(使用ROW_NUMBER()查询带条件的时候提示列名无效)

    declare @pageIndex int -- 第几页 declare @pageSize int -- 每页包含的记录数 --这里注意一下,不能直接把变量放在这里,要用select select ...

  4. ES6 新增集合----- Set 和Map

    Sets 和数组一样,都是一些有序值的的集合,但是Sets 和数组又有所不同,首先Sets 集合中不能存有相同的值,如果你向Sets 添加重复的值,它会忽略掉, 其次Sets 集合的作用也有所不同,它 ...

  5. Flink入门 - 窗口函数

    /* * ProcessWinFunOnWindow */ final StreamExecutionEnvironment streamExecutionEnvironment = StreamEx ...

  6. Python illustrating Downhill simplex method for minimizing the user-supplied scalar function的代码

    学习过程,把代码过程较好的代码段做个记录,如下的代码段是关于Python illustrating Downhill simplex method for minimizing the user-su ...

  7. scrapy 爬虫中间件 deepth深度

    源码 class DepthMiddleware(object): def __init__(self, maxdepth, stats, verbose_stats=False, prio=1): ...

  8. union的使用

    将多条select语句的结果,合并到一起,称为联合查询 使用union关键字 场景: 获取数据的条件,出现逻辑冲突,或者很难在一个逻辑内表示,就可以拆成多个逻辑,分别实现,最后将结果合并到一起 sel ...

  9. unittest管理接口用例

    1.加入unittest框架 #coding=utf-8 import requests import unittest class TestApi(unittest.TestCase): def s ...

  10. Gtest:事件

    前言 有时候在测试的时候,我们会在测试前做一些初始化活动,和测试后做一些清理工作,gtest提供了多种事件机制,非常方便我们在案例之前或之后做一些操作.总结一下gtest的事件一共有3种: 全局的,所 ...