正题

题目链接:https://www.luogu.com.cn/problem/CF19E


题目大意

给出\(n\)个点\(m\)条边的一张无向图,求有多少条边去掉后可以使得图变成一张二分图。

\(1\leq n,m\leq 10^4\)


解题思路

虽然线段树分治可以暴力草过去但是考虑点智慧的做法。

众所周知没有奇环是图是二分图的充要条件,所以答案就是奇环的交。

显然无法考虑所有的奇环,但是我们可以考虑一下简单奇环。

先随便跑出一个生成树,然后枚举所有非树边考虑其在树上的环,只考虑树边的话答案肯定是所有简单奇环的交。并且这条边不能出现在一个枚举出的偶环上,因为如果这条边即在一个奇环又在一个偶环上,那么这两个环的不交部分一定是一个奇环,所以这条边就不成立了。

然后对于非树边,显然条件就是这条边必须得是唯一一个树上奇环的边。

用\(dfs\)搜出生成树,此时所有的非树边都是返祖边,这样我们就可以用树上差分计算树边的条件了。

时间复杂度\(O(n+m)\)(不算答案用的排序)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e4+10;
struct node{
int to,next,w;
}a[N<<1];
int n,m,tot,cnt,ant,last;
int ls[N],v[N],s[N],from[N],ans[N];
void addl(int x,int y,int w){
a[++tot].to=y;
a[tot].next=ls[x];
a[tot].w=w;
ls[x]=tot;return;
}
void dfs(int x){
for(int i=ls[x];i;i=a[i].next){
int y=a[i].to;
if((i^1)==from[x])continue;
if(v[y]&&v[x]>v[y]){
if((v[x]-v[y])&1)s[x]--,s[y]++;
else s[x]++,s[y]--,cnt++,last=a[i].w;
}
else if(!v[y]){
v[y]=v[x]+1;
from[y]=i;
dfs(y);
s[x]+=s[y];
}
}
return;
}
int main()
{
scanf("%d%d",&n,&m);tot=1;
for(int i=1,x,y;i<=m;i++){
scanf("%d%d",&x,&y);
addl(x,y,i);addl(y,x,i);
}
for(int i=1;i<=n;i++)
if(!v[i])v[i]=1,dfs(i);
if(!cnt){
printf("%d\n",m);
for(int i=1;i<=m;i++)
printf("%d ",i);
return 0;
}
if(cnt==1)ans[++ant]=last;
for(int i=1;i<=n;i++)
if(s[i]==cnt)ans[++ant]=a[from[i]].w;
sort(ans+1,ans+1+ant);
ant=unique(ans+1,ans+1+ant)-ans-1;
printf("%d\n",ant);
for(int i=1;i<=ant;i++)
printf("%d ",ans[i]);
return 0;
}

CF19E-Fairy【树形结构,差分】的更多相关文章

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

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

  2. js文章列表的树形结构输出

    文章表设计成这样了 后端直接给了无任何处理的json数据,现在要前端实现树形结构的输出,其实后端处理更简单写,不过既然来了就码出来 var doclist = [{ "id": 1 ...

  3. GridView 树形结构分组的功能

    在“会飞的鱼”博客中看到GridView实现树形结构的代码,经过修改,添加了树形结构中的复选框功能,欢迎吐槽. 源地址:http://www.cnblogs.com/chhuic/archive/20 ...

  4. [从产品角度学EXCEL 02]-EXCEL里的树形结构

    这是<从产品角度学EXCEL>系列第三篇. 前言请看: 0 为什么要关注EXCEL的本质 1 excel是怎样运作的 或者你可以去微信公众号@尾巴说数 获得连载目录. 本文仅由尾巴本人发布 ...

  5. C# EasyUI树形结构权限管理模块

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精 本节和大家探讨下C#使用EasyUI树形结构/Tree构 ...

  6. YbSoftwareFactory 代码生成插件【十八】:树形结构下的查询排序的数据库设计

    树形结构的排序在中国特色下十分普遍也非常重要,例如常说的五大班子,党委>人大>政府>政协>纪委,每个班子下还有部门,岗位,人员,最终排列的顺序通常需要按权力大小.重要性等进行排 ...

  7. Java创建树形结构算法实例

    在JavaWeb的相关开发中经常会涉及到多级菜单的展示,为了方便菜单的管理需要使用数据库进行支持,本例采用相关算法讲数据库中的条形记录进行相关组装和排序讲菜单组装成树形结构. 首先是需要的JavaBe ...

  8. Atitit 常见的树形结构 红黑树  二叉树   B树 B+树  Trie树 attilax理解与总结

    Atitit 常见的树形结构 红黑树  二叉树   B树 B+树  Trie树 attilax理解与总结 1.1. 树形结构-- 一对多的关系1 1.2. 树的相关术语: 1 1.3. 常见的树形结构 ...

  9. 使用ztree.js,受益一生,十分钟学会使用tree树形结构插件

    看到ztree.js,这几个字眼,毋庸置疑,那肯定就是tree树形结构了,曾经的swing年代有jtree,后来jquery年代有jstree和treeview,虽然我没写过,但是我见过,一些小功能做 ...

随机推荐

  1. springboot整合zookeeper实现分布式锁

    目录 01 安装并允许zookeeper 02 springboot应用配置CuratorFramework 03 使用zookeeper实现集群只一个应用实例执行定时任务 04 使用zookeepe ...

  2. 根据当前设备的宽度,动态计算出rem的换算比例,实现页面中元素的等比缩放

    ~function anonymous(window){ //根据当前设备的宽度,动态计算出rem的换算比例,实现页面中元素的等比缩放 let computedREM = function compu ...

  3. 【springcloud】springcloud与springboot的版本对应关系

    官方网址:https://start.spring.io/actuator/info 更新时间:2019-12-01 spring-cloud: "Finchley.M2": &q ...

  4. .net core signalR 服务端强制中断用户连接

    .net core signalR 服务端断开连接 { } { } *:first-child { } *:last-child { } { } { } { } { } { } { } { } { } ...

  5. 关于对String中intern方法的理解

    在java的String中有个一直被我们忽视了的方法intern方法:它的官方解释是:一个初始时为空的字符串池,它由类 String 私有地维护. 当调用 intern 方法时,如果池已经包含一个等于 ...

  6. 前端 | 页面触底自动加载 Vue 组件

    不管是 web 端还是移动端,信息流都是现在很流行的信息展示方式.信息流经常搭配自动加载一起使用以获得更好的使用体验. 最近在使用 Vue 开发过程中也遇到了首页信息流自动加载的需求.大致了解了一下几 ...

  7. rabbitMq接收实体

  8. 备忘:Linux内核编程的几个注意事项

    虚拟地址转物理地址要用__pa 内核程序创建的一段地址连续的共享内存,通过内存映射可以让用户态进程存取.之前在RHEL/CentOS的x86_64架构上工作正常.后来在aarch64架构的银河麒麟(L ...

  9. Eclipse中安装配置Gradle

    Gradle是以Groovy语言为基础,面向Java应用为主.基于DSL(领域特定语言)语法的自动化构建工具. gradle对多工程的构建支持很出色,工程依赖是gradle的第一功能. gradle支 ...

  10. shell脚本之case语句

    case ... esac 为多选择语句,与其他语言中的 switch ... case 语句类似,是一种多分枝选择结构,每个 case 分支用右圆括号开始,用两个分号 ;; 表示 break,即执行 ...