[Codeforces 19E] Fiary
Brief Intro:
给定一个无向图,询问删去哪条边能使得剩下的图为一个二分图,输出所有结果
Algorithm:
关于二分图的重要性质:一个图为二分图的充要条件为其中没有奇环
1、如果没有奇环,那么删去任何一条边都不会使其变为奇环
2、如果存在一个或多个奇环,删去的边必为所有奇环的一条公共边
但这样仍然无法保证残余图是一个二分图:因为有偶环的存在
为了寻找奇环或者偶环,我们一般采取dfs树的方式
我们可以证明(奇偶性判断即可)当一个环上有两个偶返祖边或两个奇返祖边时,这个环必为偶环
而当一个环上有一个奇返祖边以及一个偶返祖边时,这个环必为奇环
如果一条边有一个奇环以及一个偶环通过,那么删去这条边后一定会出现一个环中包含一个奇返祖边和一个偶返祖边
从而出现奇环,不成立
题目被转化为:求出既是所有奇环公共边又不在任何一个偶环中的边
dfs树维护每条边经过的奇/偶环个数即可
Code:
#include <bits/stdc++.h> using namespace std;
typedef pair<int,int> P;
typedef long long ll;
#define F first
#define S second const int MAXN=1e4+;
int n,m,odd[MAXN],even[MAXN],vis[MAXN],match[MAXN],col[MAXN],st,cnt;
vector<P> G[MAXN];
vector<int> res; void dfs(int cur,int anc)
{
vis[cur]=;col[cur]=col[anc]^;
for(int i=;i<G[cur].size();i++)
{
P t=G[cur][i];
if(t.F==anc) continue;
if(!vis[t.F]) //将点和其父边配对
match[t.F]=t.S,dfs(t.F,cur),odd[cur]+=odd[t.F],even[cur]+=even[t.F];
else if(vis[t.F]==)
col[cur]==col[t.F]?odd[cur]++,st=t.S,cnt++:even[cur]++;
else
col[cur]==col[t.F]?odd[cur]--:even[cur]--; //如果到了一个环的起始点,那么该点的父边不在环中
}
vis[cur]=-; //不同的标记
} int main()
{
cin >> n >> m;
for(int i=;i<=m;i++)
{
int x,y;cin >> x >> y;
G[x].push_back(P(y,i));G[y].push_back(P(x,i));
} for(int i=;i<=n;i++)
if(!vis[i])
dfs(i,); if(cnt==)
for(int i=;i<=m;i++) res.push_back(i);
else
{
if(cnt==) res.push_back(st); //如果只有一个奇环,起始边也符合条件
for(int i=;i<=n;i++)
if(odd[i]==cnt && !even[i]) res.push_back(match[i]);
sort(res.begin(),res.end());
} cout << res.size() << endl;
for(int i=;i<res.size();i++)
cout << res[i] << " "; return ;
}
Review:
1、二分图的充要条件:不含奇环
同时不用考虑原图中的所有环,而只要考虑dfs树构造出的环即可
2、可采用dfs树的方式计算图中的奇、偶环
注意对一个环起始点的特殊处理
(UPD:实际上这是一个$dfs$树上差分的过程)
3、由于dfs树的无后效性,如果一个大环中包含两条返祖边,去掉两小环的公共路径*2,不改变两小环总和的奇偶性,从而能推断出大环的奇偶性
利用dfs树中的迭代性、公共路径推出有用的结论
4:注意很多时候只要考虑$dfs$返祖边的环即可!!!!
[Codeforces 19E] Fiary的更多相关文章
- bzoj 4424: Cf19E Fairy && codeforces 19E. Fairy【树形dp】
参考:https://blog.csdn.net/heheda_is_an_oier/article/details/51131641 这个找奇偶环的dp1真是巧妙,感觉像tarjan一样 首先分情况 ...
- Codeforces 19E 树上差分
思路: 先随便建出来一棵搜索树(图可能不连通?) 每一条非树边(剩下的边)和树边都可以构成一个环. 我们只看一个非树边和某些树边构成的这些环. 分成三种情况: 1.没有奇环 所有边都可以删 2.有一 ...
- Codeforces 19E&BZOJ 4424 Fairy(好题)
日常自闭(菜鸡qaq).不过开心的是看了题解之后1A了.感觉这道题非常好,必须记录一下,一方面理清下思路,一方面感觉自己还没有完全领会到这道题的精髓先记下来以后回想. 题意:给定 n 个点,m 条边的 ...
- python爬虫学习(5) —— 扒一下codeforces题面
上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
- 【Codeforces 738C】Road to Cinema
http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...
- 【Codeforces 738A】Interview with Oleg
http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...
- CodeForces - 662A Gambling Nim
http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...
- CodeForces - 274B Zero Tree
http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...
随机推荐
- 强大的JQuery数组封装使用
JQuery对数组的处理非常便捷并且功能强大齐全,一步到位的封装了很多原生js数组不能企及的功能.下面来看看JQuery数组的强大之处在哪. $.each(array, [callback]) 遍历 ...
- linux+GraphicsMagick 安装
转摘自:http://blog.csdn.net/fhqsse220/article/details/12995763 GraphicsMagick 安装 下载软件:download:ftp://ft ...
- 转:java 帐号激活与忘记密码 实例
原文链接:http://endual.iteye.com/blog/1613679 一.帐户激活 在 很多时候,在某些网站注册一个用户之后,网站会给这个用户注册时填写的email地址发送一封帐户激 ...
- OpenStack环境初始化
环境概述 系统:CentOS_7.2_x64_mininal 因配置有限,本次试验使用三台虚拟机,一台控制节点,一台计算节点,一台网络节点,控制机点配置4G内存,2CPU,其他节点都2G内存,一个C ...
- bzoj4900 [CTSC2017]密钥
传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=4900 [题解] 恭喜bzoj达到40页 考场由于傻逼基数排序写挂了而gg. 竟然忘了考试前一 ...
- xampp命令
XAMPP命令安装 XAMPPtar xvfz xampp-linux-1.6.4.tar.gz -C /opt启动 XAMPP/opt/lampp/lampp start停止 XAMPP/opt/l ...
- 【mysql优化1】表的优化与列类型选择
数据类型及字节数参考http://www.cnblogs.com/qlqwjy/p/8590639.html -------------------------表的优化:--------------- ...
- wxpython布局管理部件wx.gridbagsizer用法示例
text = ("This is text box") panel = wx.Panel(self, -1) chkAll1 = wx.CheckB ...
- Swift 枚举(七)
http://blog.csdn.net/huangchentao/article/details/32714621 枚举 1.枚举语法 用enum并把定义放在大括号内,枚举中被定义的值是枚举的成员, ...
- (十四)git操作
https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000