题目链接:http://lightoj.com/volume_showproblem.php?problem=1300

边双连通分量首先dfs找出桥并标记,然后dfs交叉着色找奇圈上的点。这题只要求在奇圈上的点个数。容易得到,一个边双联通分量如果存在奇圈,那么整个分量上的点都属于某个奇圈。

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<cmath>
  4. #include<iostream>
  5. #include<algorithm>
  6. #include<queue>
  7. #include<vector>
  8. using namespace std;
  9. const int maxn = ;
  10. const int maxe = ;
  11. const int INF = 0x3f3f3f;
  12.  
  13. int pre[maxn],low[maxn],dfs_clock;
  14. bool isbridge[maxe*];
  15.  
  16. struct Edge{
  17. int u,v;
  18. int next;
  19. Edge(int u=,int v=,int next=): u(u) , v(v), next(next) {}
  20. }edges[maxe*];
  21. int head[maxn],cnt;
  22.  
  23. int color[maxn]; //用交叉染色法进行判断奇圈;
  24. bool flag;
  25. int n,m;
  26. int ans,tempans;
  27.  
  28. void tarjan(int u,int fa){
  29. pre[u] = low[u] = dfs_clock++;
  30. for(int i=head[u];i!=-;i=edges[i].next){
  31. int v = edges[i].v;
  32. if(!pre[v]){
  33. tarjan(v,u);
  34. low[u] = min(low[u],low[v]);
  35. if(low[v] > pre[u]) { isbridge[i] = true; isbridge[i^] = true; }
  36. }
  37. else if(pre[v] < pre[u] && v != fa) //u->v是反向边;
  38. low[u] = min(low[u],pre[v]);
  39. }
  40. }
  41.  
  42. void dfs_paint(int u,int fa_c){
  43. color[u] = fa_c;
  44. tempans++;
  45. for(int i=head[u];i!=-;i=edges[i].next){
  46. if(isbridge[i]) continue; //访问到桥跳过;
  47. int v = edges[i].v;
  48. if(!color[v]) dfs_paint(v,-fa_c); //还没有染色;
  49. else if(color[u] == color[v])
  50. flag = true;
  51. }
  52. }
  53.  
  54. void addedge(int u,int v){
  55. edges[cnt] = Edge(u,v,head[u]);
  56. head[u] = cnt++;
  57. }
  58. int main()
  59. {
  60. // freopen("E:\\acm\\input.txt","r",stdin);
  61. int T;
  62. cin>>T;
  63. for(int t=;t<=T;t++){
  64. cin>>n>>m;
  65. memset(head,-,sizeof(head));
  66. cnt = ;
  67. for(int i=;i<=m;i++){
  68. int a,b;
  69. scanf("%d %d",&a,&b);
  70. edges[cnt] = Edge(a,b,head[a]);
  71. head[a] = cnt++;
  72. edges[cnt] = Edge(b,a,head[b]);
  73. head[b] = cnt++;
  74. //addedge(a,b);
  75. //addedge(b,a);
  76. }
  77. dfs_clock = ;
  78. memset(pre,,sizeof(pre));
  79. memset(isbridge,,sizeof(isbridge));
  80. for(int i=;i<n;i++)
  81. if(!pre[i]) tarjan(i,-);
  82.  
  83. memset(color,,sizeof(color));
  84. ans = ;
  85. for(int i=;i<n;i++){
  86. if(!color[i]){
  87. flag = false;
  88. tempans = ;
  89. dfs_paint(i,); //交叉染色法
  90. if(flag)
  91. ans += tempans;
  92. }
  93. }
  94. printf("Case %d: %d\n",t,ans);
  95. }
  96. }

lightoj 1300 边双联通分量+交叉染色求奇圈的更多相关文章

  1. 训练指南 UVALive - 3523 (双联通分量 + 二分图染色)

    layout: post title: 训练指南 UVALive - 3523 (双联通分量 + 二分图染色) author: "luowentaoaa" catalog: tru ...

  2. POJ 2942 Knights of the Round Table 补图+tarjan求点双联通分量+二分图染色+debug

    题面还好,就不描述了 重点说题解: 由于仇恨关系不好处理,所以可以搞补图存不仇恨关系, 如果一个桌子上面的人能坐到一起,显然他们满足能构成一个环 所以跑点双联通分量 求点双联通分量我用的是向栈中pus ...

  3. poj 3177&&3352 求边双联通分量,先求桥,然后求分量( 临界表代码)

    /*这道题是没有重边的,求加几条边构成双联通,求边联通分量,先求出桥然后缩点,成一个棵树 找叶子节点的个数*/ #include<stdio.h>//用容器写在3177这个题上会超内存,但 ...

  4. Spoj 2878 KNIGHTS - Knights of the Round Table | 双联通分量 二分图判定

    题目链接 考虑建立原图的补图,即如果两个骑士不互相憎恨,就在他们之间连一条无向边. 显而易见的是,如果若干个骑士在同一个点数为奇数的环上时,他们就可以在一起开会.换句话说,如果一个骑士被一个奇环包含, ...

  5. 【POJ2942】Knights of the Round Table(二分图 点双联通分量)

    题目链接 大意 给定\(N\)个点与\(M\)个关系,每个关系表示某两个点间没有直接的边相连,求不在所有奇环上的点的个数. (\(1\le N\le 1e3,1\le M\le 1e6\)) 思路 考 ...

  6. poj2942(双联通分量,交叉染色判二分图)

    题意:一些骑士,他们有些人之间有矛盾,现在要求选出一些骑士围成一圈,圈要满足如下条件:1.人数大于1.2.总人数为奇数.3.有仇恨的骑士不能挨着坐.问有几个骑士不能和任何人形成任何的圆圈. 思路:首先 ...

  7. POJ2942 Knights of the Round Table【Tarjan点双联通分量】【二分图染色】【补图】

    LINK 题目大意 有一群人,其中有一些人之间有矛盾,现在要求选出一些人形成一个环,这个环要满足如下条件: 1.人数大于1 2.总人数是奇数 3.有矛盾的人不能相邻 问有多少人不能和任何人形成任何的环 ...

  8. 【POJ 2942】Knights of the Round Table(双联通分量+染色判奇环)

    [POJ 2942]Knights of the Round Table(双联通分量+染色判奇环) Time Limit: 7000MS   Memory Limit: 65536K Total Su ...

  9. 『Tarjan算法 无向图的双联通分量』

    无向图的双连通分量 定义:若一张无向连通图不存在割点,则称它为"点双连通图".若一张无向连通图不存在割边,则称它为"边双连通图". 无向图图的极大点双连通子图被 ...

随机推荐

  1. ViewPager + Fragment 实现类微信界面

    在如今的互联网时代,微信已是一个超级App.这篇通过ViewPager + Fragment实现一个类似于微信的界面,之前有用FragmentTabHost实现过类似界面,ViewPager的实现方式 ...

  2. Win10获取管理员/administrator权限的方法

    与Win7不同,Win10右键文件夹菜单,是没有“获取管理员权限”这个功能的,但是有时候我们偏偏需要用到这个功能,怎么办呢,可以按照这个办法实现:把下面的这一段代码复制下来放在文本文档中,然后另存为. ...

  3. linux常用命令之ln

    ln是linux中又一个非常重要命令,它的功能是为某一个文件在另外一个位置建立一个同不的链接,这个命令最常用的参数是-s,具体用法是:ln –s 源文件 目标文件. 当我们需要在不同的目录,用到相同的 ...

  4. [转]Delphi Form的释放和隐藏:free,hide,close

    form.Free - 释放Form占用的所有资源.Free后,Form指针不能再使用,除非对Form重新赋值. form.Hide - 隐藏Form.可以调用form.Show再一次显示. form ...

  5. servlet的doPost 和doGet和web文件结构

    doPost和doGet分别由 tomcat自己来决定调用post 还是get 方式查询 get:url有少量的参数信息,一般用到查询那里 (像百度.. post一般用来提交大文件数据(二进制数据 d ...

  6. CSS3 :nth-child() 选择器

    CSS3 :nth-child() 选择器 代码: <!DOCTYPE html> <html> <head> <style> p:nth-child( ...

  7. iOS手势识别的详细使用(拖动,缩放,旋转,点击,手势依赖,自定义手势)

    iOS手势识别的详细使用(拖动,缩放,旋转,点击,手势依赖,自定义手势)       1.UIGestureRecognizer介绍 手势识别在iOS上非常重要,手势操作移动设备的重要特征,极大的增加 ...

  8. 优秀开源项目的svn地址

    很多优秀的开源项目已经提供SVN源码签出了,无论是解疑还是学习,都是一大幸福之事啊! Apache的SVN库,强烈推荐! http://svn.apache.org/repos/asf/ 里面不但有S ...

  9. Java 内部类种类及使用解析

    package com.learnjava.innerclass; class MemberInner { private int d = 1; private int a = 2; // 定义一个成 ...

  10. 修改weblogic jvm启动参数

    进入: D:\Oracle\Middleware\user_projects\domains\base_domain\startWebLogic.cmd 在call 上一行增加: set USER_M ...