[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 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...
随机推荐
- Website Collection
前一百个卡特兰数 Candy?的博弈论总结 杜教筛资料 线性基资料 (ex)BSGS资料 斐波那契数列前300项 斯特林数 STL标准库-容器-unordered_set C++ unordered_ ...
- vector 基础
http://classfoo.com/ccby/article/jnevK Vector的存储空间是连续的,list不是连续存储的 vector初始化 vector<int>v; //不 ...
- ar用法小记
ar是用来创建.修改或者从档案文件中提取的GNU程序,它被认为是一个二进制的工具,因为它最大的应用就是将一些子程序归档为库文件. 用法概述 ar [-]p[mod [relpos] [count]] ...
- 安卓recyclerview的基本使用
1.先在布局文件中写 <android.support.v7.widget.RecyclerView android:id="@+id/my_recycler_view" a ...
- CSS3学习笔记之径向展开菜单
效果截图: HTML代码: <div class="menu-wrap"> <nav> <a href="" class=&quo ...
- Java并发(8)- 读写锁中的性能之王:StampedLock
在上一篇<你真的懂ReentrantReadWriteLock吗?>中我给大家留了一个引子,一个更高效同时可以避免写饥饿的读写锁---StampedLock.StampedLock实现了不 ...
- 2016"百度之星" - 初赛(Astar Round2A)--HDU 5690 |数学转化+快速幂
Sample Input 3 1 3 5 2 1 3 5 1 3 5 99 69 Sample Output Case #1: No Case #2: Yes Case #3: Yes Hint ...
- [BZOJ1151][CTSC2007]动物园zoo 解题报告|DP|位运算
Description 最近一直在为了学习算法而做题,这道题是初一小神犇让我看的.感觉挺不错于是写了写. 这道题如果是一条线的话我们可以构造一个DP f[i,j]表示以i为起点,i,i+1...i+4 ...
- 用python写爬虫笔记(一)
https://bitbucket.org/wswp/code http://example.webscraping.com http://www.w3schools.com selenium.g ...
- 转:java读取配置文件的几种方法
转自: http://www.iteye.com/topic/56496 在现实工作中,我们常常需要保存一些系统配置信息,大家一般都会选择配置文件来完成,本文根据笔者工作中用到的读取配置文件的方法小小 ...