[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 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...
随机推荐
- shell编程---变量赋值
echo $filen | awk -F. '{print $3}' 怎么把上边这行脚本产生的字串赋给一个变量啊,实际上会产生一个数, 这个变量用来存这个数.格式应该是怎么写的? a=`echo $ ...
- JSON.parse() 和 JSON.stringify()使用
1.parse()是用于从一个字符串中解析出json对象 定义一个字符串:var str = '{"name":"superman","age&quo ...
- 前端面试:什么是css reset
HTML标签在浏览器中都有默认的样式,不同的浏览器的默认样式之间存在差别.例如ul默认带有缩进样式,在IE下,它的缩进是由margin实现的,而在Firefox下却是由padding实现的.开发时浏览 ...
- powercmd注册码
推荐一个很方便的软件:powercmd 用户名:nzone 注册码:PCMDA-86128-PCMDA-70594 . 下载地址网上很多: http://soft.hao123.com/soft/a ...
- 从一段字符串中去除数字的shell方法
- alt+ F8 设置无效(转)
原文转自 https://blog.csdn.net/m372897500/article/details/7310251 具体修改方法如下: 工具-选项-环境-键盘-应用以下其他键盘映射方案,选择v ...
- [Leetcode Week11]Kth Largest Element in an Array
Kth Largest Element in an Array 题解 题目来源:https://leetcode.com/problems/kth-largest-element-in-an-arra ...
- Swift开发学习(二):Playground
http://blog.csdn.net/powerlly/article/details/29674253 Swift开发学习:Playground 关于 对于软件用户.游戏玩家,大家一直都在提倡用 ...
- HDU1248 (完全背包简单变形)
寒冰王座 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submis ...
- appium===出错时截图的方法,自动截图
try: driver.find_element_by_id("kwsss").send_keys("selenium") driver.find_elemen ...