1. /*这道题是没有重边的,求加几条边构成双联通,求边联通分量,先求出桥然后缩点,成一个棵树
  2. 找叶子节点的个数*/
  3. #include<stdio.h>//用容器写在3177这个题上会超内存,但是用临界表过了
  4. #include<string.h>/*此代码为临界表代码*/
  5. #define N 5100
  6. struct node {
  7. int u,v,next;
  8. }bian[N*4];
  9. int dfn[N],low[N],index,f[N*4],n,head[N],yong;
  10. int Min(int a,int b) {
  11. return a>b?b:a;
  12. }
  13. void addedge(int u,int v) {//建边
  14. bian[yong].u=u;
  15. bian[yong].v=v;
  16. bian[yong].next=head[u];
  17. head[u]=yong++;
  18. }
  19. void tarjan(int u,int pre) {//
  20. dfn[u]=low[u]=++index;
  21. int i;
  22. for(i=head[u];i!=-1;i=bian[i].next) {
  23. int v=bian[i].v;
  24. if(i==(pre^1))continue;
  25. if(!dfn[v]) {
  26. tarjan(v,i);
  27. low[u]=Min(low[u],low[v]);//
  28. if(low[v]>dfn[u])//标记桥
  29. f[i]=f[i^1]=1;//标记双向的边
  30. }
  31. else
  32. low[u]=Min(low[u],dfn[v]);
  33. }
  34. }
  35. int cnt,c[N];
  36. void dfs(int u,int fa) {//缩点
  37. int i;
  38. c[u]=cnt;//不能放到循环里面,
  39. for(i=head[u];i!=-1;i=bian[i].next) {
  40. int v=bian[i].v;
  41. if(!f[i]&&!c[v]&&i!=(fa^1))//桥不能走,不能回头路,没有被缩过
  42. dfs(v,i);
  43. }
  44. return ;
  45. }
  46. int degree[N];
  47. int slove() {
  48. int i;
  49. cnt=1;
  50. memset(c,0,sizeof(c));
  51. for(i=1;i<=n;i++)//缩点
  52. if(!c[i]) {
  53. dfs(i,-1);
  54. cnt++;
  55. }
  56. memset(degree,0,sizeof(degree));
  57. for(i=0;i<yong;i++) {
  58. int u,v;
  59. u=bian[i].u;
  60. v=bian[i].v;
  61. if(c[u]!=c[v]) {//所有边中
  62. degree[c[u]]++;
  63. degree[c[v]]++;//记录度数
  64. }
  65. }
  66. int leave=0;
  67. for(i=1;i<cnt;i++) {//度数为一的叶子节点,因为为双向边
  68. if(degree[i]==2)
  69. leave++;
  70. }
  71. return (leave+1)/2;
  72. }
  73. int main() {
  74. int m,i,a,b,ans;
  75. while(scanf("%d%d",&n,&m)!=EOF) {
  76. memset(dfn,0,sizeof(dfn));
  77. memset(low,0,sizeof(low));
  78. memset(f,0,sizeof(f));
  79. yong=0;
  80. memset(head,-1,sizeof(head));
  81. index=0;
  82. while(m--){
  83. scanf("%d%d",&a,&b);
  84. addedge(a,b);
  85. addedge(b,a);
  86. }
  87. for(i=1;i<=n;i++)
  88. if(!dfn[i])
  89. tarjan(i,-1);
  90. ans=slove();
  91. printf("%d\n",ans);
  92. }
  93. return 0;
  94. }

poj 3177&&3352 求边双联通分量,先求桥,然后求分量( 临界表代码)的更多相关文章

  1. POJ 3352 Road Construction ; POJ 3177 Redundant Paths (双联通)

    这两题好像是一样的,就是3177要去掉重边. 但是为什么要去重边呢??????我认为如果有重边的话,应该也要考虑在内才是. 这两题我用了求割边,在去掉割边,用DFS缩点. 有大神说用Tarjan,不过 ...

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

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

  3. hdu 3352 求边双联通分量模板题(容器)

    /*这道题是没有重边的,求加几条边构成双联通,求边联通分量,先求出桥然后缩点,成一个棵树 找叶子节点的个数*/ #include<stdio.h> #include<string.h ...

  4. POJ3177 & 求边双联通分量

    题意: 给一张无向图,求加多少边使原图任意两点边双联通. SOL: 一个不会写边双点双强联通的傻逼. 一个结论:把一棵树变成满足条件的图需要加的边使入度为1的点数+1除以2.------>就是树 ...

  5. 【UVA10972】RevolC FaeLoN (求边双联通分量)

    题意: 给你一个无向图,要求把所有无向边改成有向边,并且添加最少的有向边,使得新的有向图强联通. 分析: 这题的解法还是很好想的.先用边双联通分量缩点,然后找新图中入度为0和为1的点,入度为0则ans ...

  6. 洛谷P2860 [USACO06JAN]冗余路径Redundant Paths(tarjan求边双联通分量)

    题目描述 In order to get from one of the F (1 <= F <= 5,000) grazing fields (which are numbered 1. ...

  7. poj 3177 Redundant Paths(边双连通分量+缩点)

    链接:http://poj.org/problem?id=3177 题意:有n个牧场,Bessie 要从一个牧场到另一个牧场,要求至少要有2条独立的路可以走.现已有m条路,求至少要新建多少条路,使得任 ...

  8. POJ 3352 Road Construction 双联通分量 难度:1

    http://poj.org/problem?id=3352 有重边的话重边就不被包含在双连通里了 割点不一定连着割边,因为这个图不一定是点连通,所以可能出现反而多增加了双连通分量数的可能 必须要用割 ...

  9. poj 2942 求点双联通+二分图判断奇偶环+交叉染色法判断二分图

    http://blog.csdn.net/lyy289065406/article/details/6756821 http://www.cnblogs.com/wuyiqi/archive/2011 ...

随机推荐

  1. 2749: [HAOI2012]外星人

    首先像我一样把柿子画出来或者看下hint 你就会发现其实是多了个p-1这样的东东 然后除非是2他们都是偶数,而2就直接到0了 算一下2出现的次数就好 #include<cstdio> #i ...

  2. word2vec和word embedding有什么区别?

    word2vec和word embedding有什么区别? 我知道这两个都能将词向量化,但有什么区别?这两个术语的中文是什么? from: https://www.zhihu.com/question ...

  3. Codeforces--630D--Hexagons(规律)

     D - Hexagons! Crawling in process... Crawling failed Time Limit:500MS     Memory Limit:65536KB    ...

  4. git 设定全局ignore

    创建: 2017/08/08   位置: $HOME/.config/git/ignore git/ignore 要自建 内容  https://github.com/github/gitignore ...

  5. thinkphp session db配置

    这篇文章主要介绍了ThinkPHP实现将SESSION存入MYSQL的方法,需要的朋友可以参考下   本文以实例讲解了ThinkPHP实现将SESSION存入MYSQL的方法,所采用的运行环境是Thi ...

  6. golang 获取statuscode

    最近日志打印的时候需要打印状态码,但是因为interface的原因直接获取失败,http.Request里面的response不知道怎么使用,所以就自己重写writeheader,write来截取st ...

  7. TypeError: Object function (req, res, next) { app.handle(req, res, next); } has no method 'configure'

    TypeError: Object function (req, res, next) { app.handle(req, res, next); } has no method 'configure ...

  8. Cannot find module 'crc'

    这个时候你只需要打开你nodejs安装的目录,在其中执行 npm install crc(这里查什么模块(module)就安装什么模块).

  9. css3动画之1--animation小例子

    1.首先看效果 2.代码及分析 <style type="text/css"> #div1 { margin:100px; position: absolute; te ...

  10. Mysql分组求和&LIMIT

    分组求和mysql> SELECT coalesce(name, '总数'), SUM(singin) as singin_count FROM employee_tbl GROUP BY na ...