http://www.lydsy.com/JudgeOnline/problem.php?id=4424

图是二分图的条件:没有奇环

所以,如果图不存在奇环,删除任意一条边都可以

如果存在奇环,

对于树边来说:

那么可能可以删除的边一定在所有奇环的交集内

而且这条边不能在偶环内

因为如果一条边既是奇环上的一条边,又是偶环上的一条边

删除这条边后,这个奇环和偶环会合并成一个新的奇环

所以最终的答案= 奇环的交集-偶环的并集

对于非树边来说:

如果只有一个奇环,那么可以删除构成环的这条非树边

树边和非树边的判断:并查集

奇环交与偶环并:差分,统计树上后缀和

#include<cmath>
#include<cstdio>
#include<iostream>
#include<algorithm> using namespace std; #define N 1000001 int e[N][],ty[N]; int tot=;
int front[N],nxt[N<<],to[N<<],id[N<<]; int F[N]; int maxd;
int fa[N][]; int dep[N]; int odd_cir,sum[N]; int ans_tot,ans[N]; void read(int &x)
{
x=; char c=getchar();
while(!isdigit(c)) c=getchar();
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
} int find(int i) { return F[i]==i ? i : F[i]=find(F[i]); } void add(int u,int v,int num)
{
to[++tot]=v; nxt[tot]=front[u]; front[u]=tot; id[tot]=num;
to[++tot]=u; nxt[tot]=front[v]; front[v]=tot; id[tot]=num;
} void dfs(int u)
{
for(int i=;i<=maxd;++i) fa[u][i]=fa[fa[u][i-]][i-];
int t;
for(int i=front[u];i;i=nxt[i])
{
t=to[i];
if(t==fa[u][]) continue;
dep[t]=dep[u]+;
fa[t][]=u;
dfs(t);
}
} int cal(int x)
{
for(int i=front[x];i;i=nxt[i])
if(to[i]!=fa[x][])
{
cal(to[i]);
if(sum[to[i]]==odd_cir) ans[++ans_tot]=id[i];
sum[x]+=sum[to[i]];
}
} int get_lca(int u,int v)
{
if(dep[u]<dep[v]) swap(u,v);
int cnt=dep[u]-dep[v];
for(int i=maxd;i>=;--i)
if(cnt&(<<i)) u=fa[u][i];
if(u==v) return u;
for(int i=maxd;i>=;--i)
if(fa[u][i]!=fa[v][i]) u=fa[u][i],v=fa[v][i];
return fa[u][];
} int main()
{
int n,m;
int u,v,fu,fv;
read(n); read(m);
for(int i=;i<=n;++i) F[i]=i;
for(int i=;i<=m;++i)
{
read(u); read(v);
fu=find(u); fv=find(v);
if(fu!=fv)
{
ty[i]=;
F[fu]=fv;
add(u,v,i);
}
e[i][]=u; e[i][]=v;
}
maxd=log(n)/log();
for(int i=;i<=n;++i)
if(find(i)==i) dep[i]=,dfs(i);
int self=;
int lca;
for(int i=;i<=m;++i)
{
u=e[i][]; v=e[i][];
if(u==v && self) { printf(""); return ; }
if(u==v) { self=i; continue; }
if(!ty[i])
{
lca=get_lca(u,v);
if((dep[u]-dep[lca]+dep[v]-dep[lca])&)
{
sum[v]--;
sum[u]--;
sum[lca]+=;
}
else
{
ty[i]=;
odd_cir++;
sum[v]++;
sum[u]++;
sum[lca]-=;
}
}
}
if(self)
{
if(!odd_cir) printf("1\n%d",self);
else printf("");
return ;
}
if(!odd_cir)
{
printf("%d\n",m);
for(int i=;i<m;++i) printf("%d ",i);
if(m) printf("%d",m);
return ;
}
for(int i=;i<=n;++i)
if(find(i)==i) cal(i);
if(odd_cir==)
for(int i=;i<=m;++i)
if(ty[i]==)
{
ans[++ans_tot]=i;
break;
}
sort(ans+,ans+ans_tot+);
printf("%d\n",ans_tot);
for(int i=;i<ans_tot;++i) printf("%d ",ans[i]);
if(ans_tot) printf("%d",ans[ans_tot]);
}

4424: Cf19E Fairy

Time Limit: 10 Sec  Memory Limit: 256 MB
Submit: 740  Solved: 187
[Submit][Status][Discuss]

Description

给定 n 个点,m 条边的无向图,可以从图中删除一条边,问删除哪些边可以使图变成
一个二分图。

Input

第 1 行包含两个整数 n,m。分别表示点数和边数。
第 2 到 m+1 行每行两个数 x,y 表示有一条(x,y)的边。

Output

输出第一行一个整数,表示能删除的边的个数。
接下来一行按照从小到大的顺序输出边的序号。

Sample Input

4 4
1 2
1 3
2 4
3 4

Sample Output

4
1 2 3 4

HINT

100%的数据,n,m<=1000000

bzoj千题计划229:bzoj4424: Cf19E Fairy的更多相关文章

  1. bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块

    http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...

  2. bzoj千题计划196:bzoj4826: [Hnoi2017]影魔

    http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...

  3. bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪

    http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...

  4. bzoj千题计划177:bzoj1858: [Scoi2010]序列操作

    http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...

  5. bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)

    https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...

  6. bzoj千题计划304:bzoj3676: [Apio2014]回文串(回文自动机)

    https://www.lydsy.com/JudgeOnline/problem.php?id=3676 回文自动机模板题 4年前的APIO如今竟沦为模板,,,╮(╯▽╰)╭,唉 #include& ...

  7. bzoj千题计划292:bzoj2244: [SDOI2011]拦截导弹

    http://www.lydsy.com/JudgeOnline/problem.php?id=2244 每枚导弹成功拦截的概率 = 包含它的最长上升子序列个数/最长上升子序列总个数 pre_len ...

  8. bzoj千题计划278:bzoj4590: [Shoi2015]自动刷题机

    http://www.lydsy.com/JudgeOnline/problem.php?id=4590 二分 这么道水题 没long long WA了两发,没判-1WA了一发,二分写错WA了一发 最 ...

  9. bzoj千题计划250:bzoj3670: [Noi2014]动物园

    http://www.lydsy.com/JudgeOnline/problem.php?id=3670 法一:KMP+st表 抽离nxt数组,构成一棵树 若nxt[i]=j,则i作为j的子节点 那么 ...

随机推荐

  1. 【RDB】MariaDB 之事务、复制、集群

    目录 简介 安装启动 权限 事务 脏读.不可重复读.幻读 MVCC 复制 异步复制 半同步复制 GTID复制 集群(Galera) 配置 监控(Zabbix) 简介 环境: CentOS 7.4.17 ...

  2. Java设计模式之适配器设计模式(项目升级案例)

    今天是我学习到Java设计模式中的第三个设计模式了,但是天气又开始变得狂热起来,对于我这个凉爽惯了的青藏人来说,又是非常闹心的一件事儿,好了不管怎么样,目标还是目标(争取把23种Java设计模式接触一 ...

  3. .netCoreMVC添加数据仓储

    在上一篇关于CodeFirst从零搭建ASP.NETCore2.0中搭建起了完整.netCoreMVC项目,在这一篇中将实现如何注册service服务和Repository数据仓储到web中实现数据的 ...

  4. linux之 sed 基础

    转载:https://www.cnblogs.com/chensiqiqi/p/6382080.html sed 介绍 Sed命令是操作,过滤和转换文本内容的强大工具.常用功能有增删改查(增加,删除, ...

  5. Unity3D与C#网站收藏

    siki学院(目前学习ing) http://www.sikiedu.com/ 雨松MOMO研究院 http://www.xuanyusong.com/ 知乎:Unity 开发教程相关回答(初步了解下 ...

  6. webug4.0安装

    官网:https://www.webug.org/ 官方版本里安装视频教程 4.26 官网打不开,分享当初存在网盘的 链接:https://pan.baidu.com/s/13rG0TLwuA3Ro0 ...

  7. 20135202闫佳歆--week3 跟踪分析Linux内核的启动过程--实验及总结

    实验三:跟踪分析Linux内核的启动过程 一.调试步骤如下: 使用gdb跟踪调试内核 qemu -kernel linux-3.18.6/arch/x86/boot/bzImage -initrd r ...

  8. 20135337朱荟潼 Linux第七周学习总结——可执行程序的装载

    朱荟潼 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 第七周 Linu ...

  9. Confluence的简单安装以及与jira链接(Confluence不知道有没有破解)

    1. 前提是安装好了jira以及下载好了confluence的安装包 这里 jira的版本是 7.2.4 confluence的版本是6.8 2. 服务器上面有sqlserver数据库. 3. 为了便 ...

  10. QT试验(1)

    今天,用Qt Creator写第一个简单的小程序“HelloQt”,运行时报错:error: cannot open C:\Users\敏\AppData\Local\Temp\main.obj.51 ...