[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 ...
随机推荐
- 一起talk C栗子吧(第一百二十七回:C语言实例--查看main函数的參数)
各位看官们,大家好,上一回中咱们说的是static关键字的样例,这一回咱们说的样例是:查看main函数的參数.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们.我们在第五十七回中介绍过mai ...
- Jmeter常用函数
一._csvRead 函数 _cvsRead函数是从外部读取参数,csvRead函数可以从一个文件中读取多个参数. 步骤: 1.先新建一个文件,例如c.txt,里面的数据存放为 web@qq.com, ...
- LINUX下搭建JAVA的开发环境
LINUX下搭建JAVA的开发环境 (2009-07-13 10:04:13) 下面就将Linux下JAVA开发环境的搭建详细道来: 1.Linux下JDK的安装 至于下载JDK的二进制可执行 ...
- Windows查看网络端口被占用情况netstat命令
在windows命令行窗口下执行: C:\>netstat -aon|findstr "80" TCP 127.0.0.1:80 0.0.0.0:0 ...
- Mycat安装及测试分片总结
1.安装jdk1.72.连接实际mysql数据库 用命令行工具或图形化客户端,连接mysql,创建DEMO所用三个分片数据库:(默认schema.xml中的配置需要三个库) CREATE databa ...
- 160624、Spark读取数据库(Mysql)的四种方式讲解
目前Spark支持四种方式从数据库中读取数据,这里以Mysql为例进行介绍. 一.不指定查询条件 这个方式链接MySql的函数原型是: 1 def jdbc(url: String, table: S ...
- macos没有任何来源怎么解决?
打开终端,输入如下命令即可: sudo spctl --master-disable
- 对数值数据的格式化处理(保留小数点后N位)
项目中有时会遇到对数值部分进行保留操作,列如保留小数点后2位,所有的数据都按这种格式处理, //保留小数点后2位,都按这种格式处理,没有补0 DecimalFormat df = new Decima ...
- Windows下QT MySQL驱动编译
在Windows环境中使用Qt进行关于MySQL数据库的操作时,会出现如下问题: QSqlDatabase: QMYSQL driver not loaded QSqlDatabase: availa ...
- Centos7管理selinux及使用firewalld管理防火墙
CentOS 7.0默认使用的是firewall作为防火墙 1.firewalld的基本使用 启动: systemctl start firewalld 查看状态: systemctl status ...