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

Source

考虑一个二分图的性质:没有奇环
在生成树上考虑每条非树边,如果它是奇环 就要选 否则不能选对应的树边 差分+1-1即可
注意特判环0/1个的情况
另外会PE 同时输出的时候还要判是否输出0
最后要sort一遍
#include<bits/stdc++.h>using namespace std;const int maxn=1000010;int n,m,cnt,head[maxn],fa[maxn],dep[maxn],f[maxn][21],d[maxn];int s[maxn],tot,used,ans,g[maxn];bool vis[maxn];int findfa(int x) { return fa[x]==x?x:fa[x]=findfa(fa[x]); }struct Edge
{int u,v,flag;
}E[maxn];struct edge
{int to,nxt,id;
}e[maxn<<1];inline void addedge(int x,int y,int id)
{e[++cnt].to=y;e[cnt].nxt=head[x];head[x]=cnt;e[cnt].id=id;
}inline void add(int x,int y,int id) { addedge(x,y,id); addedge(y,x,id); }void build(int x)
{vis[x]=1;for(int i=head[x];i;i=e[i].nxt){int y=e[i].to;if(f[x][0]!=y){f[y][0]=x;dep[y]=dep[x]+1;d[y]=i;build(y);}}
}inline void init()
{for(int j=1;j<=20;j++)for(int i=1;i<=n;i++)f[i][j]=f[f[i][j-1]][j-1];
}inline void pushup(int &x,int d)
{for(int j=20;j>=0;j--)if(dep[x]-d>=(1<<j))x=f[x][j];
}inline int lca(int x,int y)
{if(dep[x]<dep[y]) swap(x,y);if(dep[x]^dep[y]) pushup(x,dep[y]);if(x==y) return x;for(int j=20;j>=0;j--)if(f[x][j]!=f[y][j])x=f[x][j],y=f[y][j];return f[x][0];
}void dfs(int x)
{vis[x]=1;for(int i=head[x];i;i=e[i].nxt)if(f[x][0]!=e[i].to)dfs(e[i].to),s[x]+=s[e[i].to];
}int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++) fa[i]=i;for(int i=1;i<=m;i++){scanf("%d%d",&E[i].u,&E[i].v);if(findfa(E[i].u)==findfa(E[i].v)) E[i].flag=1;else E[i].flag=0,fa[findfa(E[i].u)]=findfa(E[i].v),add(E[i].u,E[i].v,i);}for(int i=1;i<=n;i++) if(!vis[i]) build(i);init();for(int i=1;i<=m;i++)if(E[i].flag){int LCA=lca(E[i].u,E[i].v);int f=-1;if(!((dep[E[i].u]+dep[E[i].v])&1)) f=1,tot++,used=i;s[E[i].u]+=f,s[E[i].v]+=f;s[LCA]-=f*2;}if(!tot){printf("%d\n",m);for(int i=1;i<m;i++) printf("%d ",i); if(m) printf("%d",m);return 0;}memset(vis,0,sizeof(vis));for(int i=1;i<=n;i++) if(!vis[i]) dfs(i);for(int i=1;i<=n;i++) if(s[i]==tot) g[++ans]=e[d[i]].id;if(tot==1) g[++ans]=used;sort(g+1,g+ans+1);printf("%d\n",ans);for(int i=1;i<ans;i++) printf("%d ",g[i]); if(ans) printf("%d",g[ans]);
}

BZOJ4424: Cf19E Fairy相关推荐

  1. bzoj4424 Cf19E Fairy 树形dp

    题目描述: 给定 n 个点,m 条边的无向图,可以从图中删除一条边,问删除哪些边可以使图变成 一个二分图. n,m<=1000000 题目分析: 戳这里详细题解 一个二分图是没有奇环的. 要让所 ...

  2. BZOJ4424 Cf19E Fairy(codeforces 19E/洛谷CF19E)

    树上差分 DFS BZOJ题目传送门 codeforces题目传送门 洛谷题目传送门 首先只有当图中没有奇环时一张图才能够二分图染色.因为只允许删一条边,那么答案就是所有奇环的交,并且奇环不能和偶环有 ...

  3. 【BZOJ4424】Cf19E Fairy DFS树

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

  4. CF19E Fairy (奇偶环,树上差分)

    CF19E Fairy 做法 统计出每条边所在的奇偶环数量 如果没有奇环 哪条边都可以 如果只有一条 删去即可 其余情况 需要删除公共边 #include <bits/stdc++.h> ...

  5. 4424: Cf19E Fairy

    如果原图没有奇环显然每条边都可以砍 下面讨论有奇环的情况 显然每个奇环都要砍到,所以砍的边一定在这些奇环的交中 然后有个结论,在交中砍边 1:砍的边一定不能在偶环上 2:只要不在偶环上,就是一个合法的 ...

  6. [bzoj 4424]Cf19E Fairy

    给定 n 个点,m 条边的无向图,可以从图中删除一条边,问删除哪些边可以使图变成 一个二分图. 这道题还是不错的. 看到无向图的题目,应该一开始要往dfs树上面想.其实是因为最近吃够教训了 那么根据上 ...

  7. bzoj 4424: Cf19E Fairy dfs

    题意 给定 n 个点,m 条边的无向图,可以从图中删除一条边,问删除哪些边可以使图变成一个二分图. n,m<=1000000 分析 只要把dfs树搞出来,然后把深度奇偶性相同的点放到同一集合,然 ...

  8. 【XSY2508】【BZOJ4424】Fairy(二分图)

    题面 Description 给定nnn个点,mmm条边的无向图(无自环),可以从图中删除一条边,问删除哪些边可以使图变成一个二分图. Input 第111行包含两个整数nnn,mmm,分别表示点数和 ...

  9. BZOJ 4424: Cf19E Fairy【强行树链剖分

    显然二分图只要没有奇环就好了 于是随便搞一棵生成树然后找出所有只包含一条非树边的环就好了 --发现求的就是所有奇环的交中不被任一偶环覆盖的边 注意如果只有一个奇环的话那条非树边也是合法答案 树链求交参 ...

最新文章

  1. Twitter团队最新研究:快速高效的可扩展图神经网络SIGN
  2. php自动加载类与路由,PHP实现路由与类自动加载步骤详解
  3. wordpress发布时间 the_title()详细参数
  4. oracle sql删除job,修改Oracle的Job Scheduler 日志级别及删除运行日志
  5. agilebpm脑图_干货基于SpringBoot2开发的Activiti引擎流程管理项目脚手架
  6. linux mariadb 乱码,配置mariadb远程访问权限,解决数据库乱码问题
  7. 【Sentry】为什么Cloudera要创建Hadoop安全组件Sentry?
  8. javaScript的常见document对象
  9. 用户注册加密操作,实现加密工具PasswordHelper
  10. IP与以太网的包收发操作
  11. JavaScript(1)之——this指针
  12. 史玉柱:创业不是靠忽悠,我的最后四个忠告
  13. c#垂直投影法_形象理解“梯度”与“法向量”的关系
  14. android动态表格数据类型,华为运动表GT表盘主题制作教程
  15. 【通信原理 入坑之路】—— 深入理解奈奎斯特第一准则与码间串扰
  16. 网络攻防之wireshark抓取登录信息
  17. excel减法函数_会计小白的EXCEL学习笔记
  18. Python爬虫 解决异步加载问题--以爬取PEXELS图片为例
  19. 斐讯dns服务器未响应,斐讯k2无线网络初始密码是?
  20. Iptables DNAT实现broadcast与unicast之间相互映射

热门文章

  1. 华为手机刷屏老显示服务器出错,华为手机刷机出现update exception emmc is readonly解决方法...
  2. Windows装机必备搜索工具Search Everything
  3. Ubuntu系统镜像下载(清华大学开源软件镜像站)(ubuntu-20.04-desktop-amd64.iso
  4. 基于SpringBoot的房屋租赁管理系统的设计与实现
  5. python操作abaqus建模教程①
  6. 5th-Generation Mobile Communication Technology(一)
  7. Linux开发篇 | Linux下制作EXT4文件系统镜像
  8. 软件开发人员的个人成长与发展
  9. 一文了解MIPI 协议中的SPMI接口介绍
  10. 求 精通数据科学 从线性回归到深度学习 PDF