[CF19E]Fairy
给定一张n个点m条边的无向图,求删除哪一条边后,能够确保构成一个二分图,输出所有可能
解法:我们知道二分图的性质是没有奇环,这道题我们也应该从这个方面入手来考虑。
如果没有奇环的话我们当然想怎么删就怎么删,毕竟两个偶环删一条边不会出来一个奇环
如果存在奇环,那么我们删边一定要删奇环上的边,而且这条边必须是所有奇环的并
还要考虑的是,如果这条边还属于某个偶环,删掉这条边后图中还会形成一个新的奇环,因此删除的边还不能属于偶环
这种关于返祖边的题目用树上差分来处理就可以
代码:
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- #define M 10010
- using namespace std;
- struct point{
- int from,to,next;
- }e[M<<];
- struct Link{
- int odd,even;
- bool flag;
- int from,to;
- }link[M];
- int n,m,num,cnt,tot;
- int head[M],odd[M],even[M],ans[M],deep[M];
- bool vis[M];
- void add(int from,int to)
- {
- e[num].next=head[from];
- e[num].from=from;
- e[num].to=to;
- head[from]=num++;
- }
- void dfs(int x)
- {
- vis[x]=true;
- for(int i=head[x];~i;i=e[i].next)
- {
- int to=e[i].to;
- if(!vis[to])
- {
- link[i>>].flag=true;
- deep[to]=deep[x]+;//树边
- dfs(to);
- }
- }
- }
- void DFS(int x)
- {
- vis[x]=true;
- for(int i=head[x];~i;i=e[i].next)
- {
- int to=e[i].to;
- if(!vis[to])//树边
- {
- DFS(to);
- odd[x]+=odd[to];
- even[x]+=even[to];
- link[i>>].odd=odd[to];
- link[i>>].even=even[to];
- }
- }
- }
- int main()
- {
- memset(head,-,sizeof(head));
- scanf("%d%d",&n,&m);
- for(int i=;i<m;i++)
- {
- scanf("%d%d",&link[i].from,&link[i].to);
- add(link[i].from,link[i].to);
- add(link[i].to,link[i].from);
- }
- for(int i=;i<=n;i++)
- if(!vis[i])
- {
- deep[i]=;
- dfs(i);
- }
- for(int i=;i<m;i++)
- {
- if(link[i].flag) continue;
- int u=link[i].from,v=link[i].to;
- if(deep[u]>deep[v]) swap(u,v);//u为祖先
- if((deep[v]-deep[u])&) even[u]--,even[v]++;
- else odd[u]--,odd[v]++,link[i].odd++,tot++;
- }
- if(!tot)
- {
- printf("%d\n",m);
- for(int i=;i<=m;i++) printf("%d ",i);
- return ;
- }
- memset(vis,,sizeof(vis));
- for(int i=;i<=n;i++)
- if(!vis[i])
- DFS(i);
- for(int i=;i<m;i++)
- {
- if(link[i].flag)
- {
- if(!link[i].even&&link[i].odd==tot) ans[++cnt]=i+;//是奇环的并且不在偶环上
- }
- else if(tot==&&link[i].odd) ans[++cnt]=i+;//如果只有一个奇环,奇环中的边都可删
- }
- printf("%d\n",cnt);
- for(int i=;i<=cnt;i++) printf("%d ",ans[i]);
- return ;
- }
[CF19E]Fairy的更多相关文章
- bzoj千题计划229:bzoj4424: Cf19E Fairy
http://www.lydsy.com/JudgeOnline/problem.php?id=4424 图是二分图的条件:没有奇环 所以,如果图不存在奇环,删除任意一条边都可以 如果存在奇环, 对于 ...
- 【BZOJ4424】Cf19E Fairy DFS树
[BZOJ4424]Cf19E Fairy Description 给定 n 个点,m 条边的无向图,可以从图中删除一条边,问删除哪些边可以使图变成一个二分图. Input 第 1 行包含两个整数 n ...
- BZOJ4424: Cf19E Fairy
树上差分的代码很简洁,dfs+差分即可 这题很多坑点啊,比如重边自环好坑 #include<cstdio> #include<cstdlib> #include<algo ...
- cf19E. Fairy(奇环 二分图染色)
题意 题目链接 Sol 非常有思维含量的一道题,队爷的论文里介绍了一种\(N \sqrt{N}\)的暴力然鹅看不懂.. 看了一下clj的\(O(nlogn)\)的题解,又翻了翻题交记录,发现\(O(n ...
- BZOJ4424/CF19E Fairy(dfs树+树上差分)
即删除一条边使图中不存在奇环.如果本身就是个二分图当然任意一条边都可以,先check一下.否则肯定要删除在所有奇环的交上的边. 考虑怎么找这些边.跑一遍dfs造出dfs树,找出返祖边构成的奇环.可以通 ...
- bzoj 4424: Cf19E Fairy && codeforces 19E. Fairy【树形dp】
参考:https://blog.csdn.net/heheda_is_an_oier/article/details/51131641 这个找奇偶环的dp1真是巧妙,感觉像tarjan一样 首先分情况 ...
- CF19E Fairy(树上差分)
题目描述 很久很久以前,有一个仙女叫做A.有一天一个少年B找到她,并且请求她预测他的未来.仙女看着她的水晶球,说这位少年不久将遇见世界上最美丽的公主,并且将迎娶她为妻.然后仙女在一张纸上画了n个点,并 ...
- HGOI20180817 (NOIP模拟Day1 task)
HGOI自测 初测:150=80+20+50 rank1~rank3(并列3个rank1,所以我是rank3 qwq) 今日分突然想简约 CF359A Table https://www.luogu. ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
随机推荐
- hdu4328(经典dp用悬线法求最大子矩形)
http://wenku.baidu.com/view/728cd5126edb6f1aff001fbb.html 关于悬线法,这里面有详解. 我当时只想到了记录最大长度,却没有想到如果连最左边和最右 ...
- 【BZOJ2055】80人环游世界 有上下界费用流
[BZOJ2055]80人环游世界 Description 想必大家都看过成龙大哥的<80天环游世界>,里面的紧张刺激的打斗场面一定给你留下了深刻的印象.现在就有这么 一个 ...
- CodeForces 156B Suspects(枚举)
B. Suspects time limit per test 2 seconds memory limit per test 256 megabytes input standard input o ...
- php 正则表达式一.函数解析
php正则表达式官方手册参考....... 一.php中 常用的正则表达式函数 1.preg_match与preg_match_all preg_match: 函数信息 preg_match_all: ...
- c#读取excel到dataset
public DataSet TransExcelToDataSet(string fileName, List<string> sheetNames) { OleDbConnection ...
- 2015-03-22——js常用的Array方法
Array array.concat(item...); //产生一个新数组如果item,是一个数组,那么它的每个元素会被分别添加(浅复制,只解析一层).示例:var a = [1, 3, 4];v ...
- DKLang Translation Editor
https://yktoo.com/en/software/dklang-traned Features Translation using a dictionary (so-called Trans ...
- 【我的Android进阶之旅】解决错误:No enum constant com.android.build.gradle.OptionalCompilationStep.FULL_APK
今天在分支编译代码并允许之后,接着同步主干代码之后,再继续点击[Run]按钮允许程序的时候报错了,错误描述日志如下所示: 一.错误描述 Error:(1, 1) A problem occurred ...
- IOS研究之IOS7四种后台机制
IOS 7中,实际上APP拥有四种后台模式.不管是哪一种后台机制,均须要利用苹果给予的对应后台接口实现.IOS7系统中,开发人员能够灵活利用多种后台接口(API)实现更加智能的应用操作. 对获取 ...
- DBA学习参考绝佳资料
原文来自:pursuer.chen 原文地址:https://www.cnblogs.com/chenmh/default.aspx?page=1 [置顶]MongoDB 文章目录 2018-02-0 ...