HDU 5215 Cycle --- 奇偶环的判定

该博客探讨了如何判断一个无向图中是否存在奇圈和偶圈。通过二分图染色来确定奇圈,使用Tarjan算法进行边双连通分量分解以判断偶圈。在求解过程中,特别强调了桥的处理和连通分量的分析,以确保正确识别图中的奇偶环。
摘要由CSDN通过智能技术生成

题意:

给出一个无向图,n<=100000,m <= 300000,判断图中是否有奇圈,是否有偶圈。

思路:

对于奇圈的判定,可以利用二分图染色。若此图是二分图,那么其中一定不存在奇圈,若此图不是二分图,那必定存在奇圈。若原图不连通,则对每个连通分量分别做二分图染色
对于偶圈的判定,首先考虑所有圈必然在边双连通分量中(题中要求的圈不一定是简单圈),边双连通分量之间是不存在圈的(因为桥的存在)。将原图用tarjan做边双连通分量分解。对于每个边双连通分量,其中必然存在至少一个圈。若此连通分量仅仅是一个圈,那么可以直接判断这个圈的奇偶性。若此连通分量是多个圈的叠加,考虑其中有公共部分的两个圈a,b,他们的奇偶性只有三种:奇奇,奇偶,偶偶。后两种已经存在偶圈,不考虑。对于第一种情况,我们一定可以通过取这两个圈的非公共边组成一个更大的偶圈。综上,若此连通分量是多个圈的叠加,则一定存在偶圈。
也就是说此边双连通分量有偶圈,当且仅当此边双连通分量是一个单一的偶圈或者是多个圈的叠加。单一的圈的判定方法:可以先求出边双连通分量中的点数a,和边数b,若a==b则是单一圈,否则是多圈叠加。

个人注意:

在求边双连通分量的过程中,tarjan标记桥别忘了反向边也要标记。

代码

#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#pragma comment(linker,"/STACK:102400000,102400000") 
using namespace std;
const int maxn = 2e5;
struct edge{
  int to,isb,rev;};//isb标记桥,rev记录反向边
int n,m;
vector<edge> G[maxn];
int col
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值