给定一张n个点m条边的无向图,求删除哪一条边后,能够确保构成一个二分图,输出所有可能

解法:我们知道二分图的性质是没有奇环,这道题我们也应该从这个方面入手来考虑。

如果没有奇环的话我们当然想怎么删就怎么删,毕竟两个偶环删一条边不会出来一个奇环

如果存在奇环,那么我们删边一定要删奇环上的边,而且这条边必须是所有奇环的并

还要考虑的是,如果这条边还属于某个偶环,删掉这条边后图中还会形成一个新的奇环,因此删除的边还不能属于偶环

这种关于返祖边的题目用树上差分来处理就可以

代码:

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #define M 10010
  5. using namespace std;
  6. struct point{
  7. int from,to,next;
  8. }e[M<<];
  9. struct Link{
  10. int odd,even;
  11. bool flag;
  12. int from,to;
  13. }link[M];
  14. int n,m,num,cnt,tot;
  15. int head[M],odd[M],even[M],ans[M],deep[M];
  16. bool vis[M];
  17. void add(int from,int to)
  18. {
  19. e[num].next=head[from];
  20. e[num].from=from;
  21. e[num].to=to;
  22. head[from]=num++;
  23. }
  24. void dfs(int x)
  25. {
  26. vis[x]=true;
  27. for(int i=head[x];~i;i=e[i].next)
  28. {
  29. int to=e[i].to;
  30. if(!vis[to])
  31. {
  32. link[i>>].flag=true;
  33. deep[to]=deep[x]+;//树边
  34. dfs(to);
  35. }
  36. }
  37. }
  38. void DFS(int x)
  39. {
  40. vis[x]=true;
  41. for(int i=head[x];~i;i=e[i].next)
  42. {
  43. int to=e[i].to;
  44. if(!vis[to])//树边
  45. {
  46. DFS(to);
  47. odd[x]+=odd[to];
  48. even[x]+=even[to];
  49. link[i>>].odd=odd[to];
  50. link[i>>].even=even[to];
  51. }
  52. }
  53. }
  54. int main()
  55. {
  56. memset(head,-,sizeof(head));
  57. scanf("%d%d",&n,&m);
  58. for(int i=;i<m;i++)
  59. {
  60. scanf("%d%d",&link[i].from,&link[i].to);
  61. add(link[i].from,link[i].to);
  62. add(link[i].to,link[i].from);
  63. }
  64. for(int i=;i<=n;i++)
  65. if(!vis[i])
  66. {
  67. deep[i]=;
  68. dfs(i);
  69. }
  70. for(int i=;i<m;i++)
  71. {
  72. if(link[i].flag) continue;
  73. int u=link[i].from,v=link[i].to;
  74. if(deep[u]>deep[v]) swap(u,v);//u为祖先
  75. if((deep[v]-deep[u])&) even[u]--,even[v]++;
  76. else odd[u]--,odd[v]++,link[i].odd++,tot++;
  77. }
  78. if(!tot)
  79. {
  80. printf("%d\n",m);
  81. for(int i=;i<=m;i++) printf("%d ",i);
  82. return ;
  83. }
  84. memset(vis,,sizeof(vis));
  85. for(int i=;i<=n;i++)
  86. if(!vis[i])
  87. DFS(i);
  88. for(int i=;i<m;i++)
  89. {
  90. if(link[i].flag)
  91. {
  92. if(!link[i].even&&link[i].odd==tot) ans[++cnt]=i+;//是奇环的并且不在偶环上
  93. }
  94. else if(tot==&&link[i].odd) ans[++cnt]=i+;//如果只有一个奇环,奇环中的边都可删
  95. }
  96. printf("%d\n",cnt);
  97. for(int i=;i<=cnt;i++) printf("%d ",ans[i]);
  98. return ;
  99. }

[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. hdu4328(经典dp用悬线法求最大子矩形)

    http://wenku.baidu.com/view/728cd5126edb6f1aff001fbb.html 关于悬线法,这里面有详解. 我当时只想到了记录最大长度,却没有想到如果连最左边和最右 ...

  2. 【BZOJ2055】80人环游世界 有上下界费用流

    [BZOJ2055]80人环游世界 Description     想必大家都看过成龙大哥的<80天环游世界>,里面的紧张刺激的打斗场面一定给你留下了深刻的印象.现在就有这么     一个 ...

  3. CodeForces 156B Suspects(枚举)

    B. Suspects time limit per test 2 seconds memory limit per test 256 megabytes input standard input o ...

  4. php 正则表达式一.函数解析

    php正则表达式官方手册参考....... 一.php中 常用的正则表达式函数 1.preg_match与preg_match_all preg_match: 函数信息 preg_match_all: ...

  5. c#读取excel到dataset

    public DataSet TransExcelToDataSet(string fileName, List<string> sheetNames) { OleDbConnection ...

  6. 2015-03-22——js常用的Array方法

    Array array.concat(item...);  //产生一个新数组如果item,是一个数组,那么它的每个元素会被分别添加(浅复制,只解析一层).示例:var a = [1, 3, 4];v ...

  7. DKLang Translation Editor

    https://yktoo.com/en/software/dklang-traned Features Translation using a dictionary (so-called Trans ...

  8. 【我的Android进阶之旅】解决错误:No enum constant com.android.build.gradle.OptionalCompilationStep.FULL_APK

    今天在分支编译代码并允许之后,接着同步主干代码之后,再继续点击[Run]按钮允许程序的时候报错了,错误描述日志如下所示: 一.错误描述 Error:(1, 1) A problem occurred ...

  9. IOS研究之IOS7四种后台机制

     IOS 7中,实际上APP拥有四种后台模式.不管是哪一种后台机制,均须要利用苹果给予的对应后台接口实现.IOS7系统中,开发人员能够灵活利用多种后台接口(API)实现更加智能的应用操作. 对获取 ...

  10. DBA学习参考绝佳资料

    原文来自:pursuer.chen 原文地址:https://www.cnblogs.com/chenmh/default.aspx?page=1 [置顶]MongoDB 文章目录 2018-02-0 ...