给定一张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的更多相关文章

  1. bzoj千题计划229:bzoj4424: Cf19E Fairy

    http://www.lydsy.com/JudgeOnline/problem.php?id=4424 图是二分图的条件:没有奇环 所以,如果图不存在奇环,删除任意一条边都可以 如果存在奇环, 对于 ...

  2. 【BZOJ4424】Cf19E Fairy DFS树

    [BZOJ4424]Cf19E Fairy Description 给定 n 个点,m 条边的无向图,可以从图中删除一条边,问删除哪些边可以使图变成一个二分图. Input 第 1 行包含两个整数 n ...

  3. BZOJ4424: Cf19E Fairy

    树上差分的代码很简洁,dfs+差分即可 这题很多坑点啊,比如重边自环好坑 #include<cstdio> #include<cstdlib> #include<algo ...

  4. cf19E. Fairy(奇环 二分图染色)

    题意 题目链接 Sol 非常有思维含量的一道题,队爷的论文里介绍了一种\(N \sqrt{N}\)的暴力然鹅看不懂.. 看了一下clj的\(O(nlogn)\)的题解,又翻了翻题交记录,发现\(O(n ...

  5. BZOJ4424/CF19E Fairy(dfs树+树上差分)

    即删除一条边使图中不存在奇环.如果本身就是个二分图当然任意一条边都可以,先check一下.否则肯定要删除在所有奇环的交上的边. 考虑怎么找这些边.跑一遍dfs造出dfs树,找出返祖边构成的奇环.可以通 ...

  6. bzoj 4424: Cf19E Fairy && codeforces 19E. Fairy【树形dp】

    参考:https://blog.csdn.net/heheda_is_an_oier/article/details/51131641 这个找奇偶环的dp1真是巧妙,感觉像tarjan一样 首先分情况 ...

  7. CF19E Fairy(树上差分)

    题目描述 很久很久以前,有一个仙女叫做A.有一天一个少年B找到她,并且请求她预测他的未来.仙女看着她的水晶球,说这位少年不久将遇见世界上最美丽的公主,并且将迎娶她为妻.然后仙女在一张纸上画了n个点,并 ...

  8. HGOI20180817 (NOIP模拟Day1 task)

    HGOI自测 初测:150=80+20+50 rank1~rank3(并列3个rank1,所以我是rank3 qwq) 今日分突然想简约 CF359A Table https://www.luogu. ...

  9. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

随机推荐

  1. iOS开发:iPhone6、6 plus适配

    本文转载至 http://jingyan.baidu.com/article/8cdccae97a5c2b315413cda9.html 1 2 3 4 5 6 7 分步阅读 随着苹果公司持续推出新产 ...

  2. 62、常规控件(5)Navigation View –美观的侧滑视图

    1.main_layout.xml <android.support.v4.widget.DrawerLayout xmlns:android="http://schemas.andr ...

  3. python技巧之下划线(二)

    Python 用下划线作为变量前缀和后缀指定特殊变量 _xxx 不能用’from module import *’导入 __xxx__ 系统定义名字 __xxx 类中的私有变量名 核心风格:避免用下划 ...

  4. oracle的order by decode根据文字自定义排序的例子

    oracle的order by decode根据文字自定义排序的例子: order by decode(t.title, '当前生效预警', 1, '今日即将生效', 2, '明日预计生效', 3, ...

  5. [LintCode] 全排列

    递归实现: class Solution { public: /** * @param nums: A list of integers. * @return: A list of permutati ...

  6. 锚点链接 阻止a标签跳转

      参考 http://blog.csdn.net/awe5566/article/details/22583699 href="#downJacket" 锚点链接 必须写: 但又 ...

  7. CodeForces 157B Trace

    B. Trace time limit per test 2 seconds memory limit per test 256 megabytes input standard input outp ...

  8. Java 常用语法和数据结构

    Collection 首先Java中的collection都是支持泛型和类型安全 由于Java单根继承, 所以不指定, 可以在collection里面放任何对象, collection会都当作obje ...

  9. XPath 快速入门

    XPath 是一门在 xml 文档中查找信息的语言. XPath 使用路径表达式来选取 xml 文档中的节点或者节点集合. 路径表达式由元素和属性组成. 语法介绍 // 示例: // xml 文档 & ...

  10. Qt 打印机支持模块

    Qt 打印支持 Qt为打印提供广泛的跨平台支持.使用每个平台上的打印系统,Qt应用程序可以打印到连接的打印机,并通过网络打印到远程打印机.Qt的打印系统还支持PDF文件生成,为基本的报告生成设施奠定了 ...