传送门:Critical Links

题意:给出一个无向图,按顺序输出桥。

分析:模板题,求出桥后排个序输出。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <string>
  4. #include <cmath>
  5. #include <iostream>
  6. #include <algorithm>
  7. #include <queue>
  8. #include <cstdlib>
  9. #include <stack>
  10. #include <vector>
  11. #include <set>
  12. #include <map>
  13. #define LL long long
  14. #define mod 100000000
  15. #define inf 0x3f3f3f3f
  16. #define eps 1e-6
  17. #define N 10010
  18. #define FILL(a,b) (memset(a,b,sizeof(a)))
  19. #define lson l,m,rt<<1
  20. #define rson m+1,r,rt<<1|1
  21. #define PII pair<int,int>
  22. using namespace std;
  23. struct edge
  24. {
  25. int v,next;
  26. edge(){}
  27. edge(int v,int next):v(v),next(next){}
  28. }e[N<<];
  29. struct bridge
  30. {
  31. int u,v;
  32. bridge(){}
  33. bridge(int u,int v):u(u),v(v){}
  34. bool operator<(const bridge &a)const{
  35. if(u==a.u)return v<a.v;
  36. return u<a.u;
  37. }
  38. }b[N<<];
  39. int n,step,top,tot,num;
  40. int head[N],dfn[N],low[N],Stack[N];
  41. bool instack[N],vis[N<<];
  42. map<int,int>mp;
  43. void init()
  44. {
  45. tot=;step=;top=;num=;
  46. FILL(head,-);FILL(dfn,);
  47. FILL(low,);FILL(instack,false);
  48. FILL(vis,);mp.clear();
  49. }
  50. bool isHash(int u,int v)
  51. {
  52. if(mp[u*N+v])return ;
  53. if(mp[v*N+u])return ;
  54. mp[u*N+v]=mp[v*N+u]=;
  55. return ;
  56. }
  57. void addedge(int u,int v)
  58. {
  59. e[tot]=edge(v,head[u]);
  60. head[u]=tot++;
  61. }
  62. void tarjan(int u)
  63. {
  64. dfn[u]=low[u]=++step;
  65. Stack[top++]=u;
  66. instack[u]=true;
  67. for(int i=head[u];~i;i=e[i].next)
  68. {
  69. int v=e[i].v;
  70. if(vis[i])continue;
  71. vis[i]=vis[i^]=;
  72. if(!dfn[v])
  73. {
  74. tarjan(v);
  75. if(low[u]>low[v])low[u]=low[v];
  76. //桥:一条无向边(u,v)是桥,当且仅当(u,v)为树枝边,且满足DFS[u]<Low[v]
  77. if(low[v]>dfn[u])
  78. {
  79. b[num++]=bridge(min(u,v),max(u,v));
  80. }
  81. }
  82. else if(low[u]>dfn[v])
  83. {
  84. low[u]=dfn[v];
  85. }
  86. }
  87. instack[u]=false;
  88. top--;
  89. }
  90. void solve()
  91. {
  92. for(int i=;i<n;i++)
  93. if(!dfn[i])tarjan(i);
  94. sort(b,b+num);
  95. printf("%d critical links\n",num);
  96. for(int i=;i<num;i++)
  97. printf("%d - %d\n",b[i].u,b[i].v);
  98. puts("");
  99. }
  100. int main()
  101. {
  102. int u,v;
  103. while(scanf("%d",&n)>)
  104. {
  105. init();
  106. for(int i=;i<=n;i++)
  107. {
  108. int t,u,v;
  109. scanf("%d (%d)",&u,&t);
  110. while(t--)
  111. {
  112. scanf("%d",&v);
  113. if(!isHash(u,v))
  114. {
  115. addedge(u,v);
  116. addedge(v,u);
  117. }
  118.  
  119. }
  120. }
  121. solve();
  122. }
  123. }

uva796(求桥数目)的更多相关文章

  1. UVA796 Critical Links(求桥) 题解

    题意:求桥 思路:求桥的条件是:(u,v)是父子边时 low[v]>dfn[u] 所以我们要解决的问题是怎么判断u,v是父子边(也叫树枝边).我们在进行dfs的时候,要加入一个fa表示当前进行搜 ...

  2. tarjan算法求桥双连通分量 POJ 3177 Redundant Paths

    POJ 3177 Redundant Paths Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 12598   Accept ...

  3. HDU 4738--Caocao's Bridges(重边无向图求桥)

    Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  4. tarjan求桥、割顶

    若low[v]>dfn[u],则(u,v)为割边.但是实际处理时我们并不这样判断,因为有的图上可能有重边,这样不好处理.我们记录每条边的标号(一条无向边拆成的两条有向边标号相同),记录每个点的父 ...

  5. 【HDU4612】 双连通分量求桥

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4612 题目大意:给你一个无向图,问你加一条边后最少还剩下多少多少割边. 解题思路:好水的一道模板题.先 ...

  6. POJ 2528 区间染色,求染色数目,离散化

    Mayor's posters Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 47905   Accepted: 13903 ...

  7. uva 796 Critical Links(无向图求桥)

    https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  8. hdu 3849 (双联通求桥)

    一道简单的双联通求桥的题目,,数据时字符串,,map用的不熟练啊,,,,,,,,,,,,, #include <iostream> #include <cstring> #in ...

  9. hdu 4738 Caocao's Bridges (tarjan求桥)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4738 题目大意:给一些点,用一些边把这些点相连,每一条边上有一个权值.现在要你破坏任意一个边(要付出相 ...

随机推荐

  1. Android 调整屏幕分辩率

    Android 可设置为随着窗口大小调整缩放比例及设定fixed的窗口大小. 对于surface的控制在SurfaceHolder类中进行 而Android 屏幕分辩率中已经有一个类DisplayMe ...

  2. iOS 多线程编程之Grand Central Dispatch(GCD)

    介绍: Grand Central Dispatch 简称(GCD)是苹果公司开发的技术,以优化的应用程序支持多核心处理器和其它的对称多处理系统的系统.这建立在任务并行运行的线程池模式的基础上的. 它 ...

  3. Linux Kbuild工作原理分析(以DVSDK生成PowerVR显卡内核模块为例)

    一.引文 前篇博文<Makefile之Linux内核模块的Makefile写法分析>,介绍了Linux编译生成内核驱动模块的Makefile的写法,但最近在DVSDK下使用Linux2.6 ...

  4. 重操JS旧业第五弹:函数

    函数在任何编程语言中起着非常重要的位置,因为他是功能的最小单元,在js中函数是一种类型 Function 1 申明与定义 显示声明:function cc(){};函数名其实是函数的一个指针,函数名某 ...

  5. Visual Studio2013创建、公布监控Windows Azure网站

    原文 Visual Studio2013创建.公布监控Windows Azure网站 随着Visual Studio 2013的发布,现在我们可以在Visual Studio内部实现Windows A ...

  6. 用lambda表达式声明委托

    首先来分享一段代码: Func<int, int, int> addMethod = (int x, int y) => (x + y); 熟悉的人肯定知道这句话是什么意思,可是不熟 ...

  7. perl 改变对象属性

    [root@wx03 test]# cat Critter.pm package Critter; #unshift(@INC,"/root/test"); #use messag ...

  8. Swift - 实现点击UITableView单元格时自动展开单元格

    下面是一个列表单元格cell的折叠展开效果的demo.当点击单元格时会展开该单元格,便于显示一些详情什么的.点击其他单元格原来的会关闭,同时有动画效果. 效果如如下:   代码如下: 1 2 3 4 ...

  9. git使用说明

    1,git clone git://github.com/schacon/simplegit.git git工作目录,暂存目录,本地代码仓库都有代码了. 2,git pull git://github ...

  10. ClusterWare 服务介绍

    一.ClusterWare启动流程图 二.Clusterware启动的代理进程 ­­­­­­­­­­­­­­­­­层次        代理进程        进程                    ...