Burning Bridges

给出含有n个顶点和m条边的连通无向图,求出所有割边的序号。

  1 #include <cstdio>
2 #include <cstring>
3 #define clr(a) memset(a,0,sizeof(a))
4 #define N 10005
5 #define M 100005
6 #define MIN(a,b) ((a)>(b)?(b):(a))
7 typedef struct NodeStr //边结点
8 {
9 int j, tag, id; //j 为另一个顶点的序号, tag 为重边的数量, id 为序号
10 struct NodeStr *next; //下一个边结点
11 }Node;
12 int n, m; //顶点数、边数
13 int nid; //nid 为输入时边的序号
14 Node mem[M*2]; int memp; //mem 为存储边结点的数组, memp 为 mem 数组中的序号
15 Node *e[N]; //邻接表
16 int bridge[M]; //bridge[i]为 1,则第 i+1 条边为割边
17 int nbridge; //求得的割边的数目
18 int low[N], dfn[N]; //low[i]为顶点 i 可达祖先的最小编号,dfn[i]为深度优先数
19 int visited[N]; //visited[i]为 0-未访问,为 1-已访问,为 2-已访问且已检查邻接顶点
20 //在邻接表中插入边(i,j),如果有重边,则只是使得相应边结点的 tag 加 1
21 int addEdge( Node *e[], int i, int j )
22 {
23 Node* p;
24 for( p=e[i]; p!=NULL; p=p->next )
25 {
26 if( p->j==j ) break;
27 }
28 if( p!=NULL ) //(i,j)为重边
29 { p->tag++; return 0; }
30 p = &mem[memp++];
31 p->j = j; p->next = e[i]; e[i] = p; p->id = nid; p->tag = 0;
32 return 1;
33 }
34
35 //参数含义: i-当前搜索的顶点, father-i 的父亲顶点, dth-搜索深度
36 void DFS( int i, int father, int dth )
37 {
38 visited[i] = 1; dfn[i] = low[i] = dth;
39 Node *p;
40 for( p=e[i]; p!=NULL; p=p->next )
41 {
42 int j = p->j;
43 if( j!=father && visited[j]==1 )
44 low[i] = MIN( low[i], dfn[j] );
45 if( visited[j]==0 ) //顶点 j 未访问
46 {
47 DFS( j, i, dth+1 );
48 low[i] = MIN( low[i], low[j] );
49 if( low[j]>dfn[i] && !p->tag ) //重边不可能是割边
50 bridge[p->id] = ++nbridge;
51 }
52 }
53 visited[i] = 2;
54 }
55 int main( )
56 {
57 int i, j, k, T; //T 为测试数据数目
58 scanf( "%d", &T );
59 while( T-- )
60 {
61 scanf( "%d%d", &n, &m );
62 memp = 0; nid = 0; clr(e);
63 for( k=0; k<m; k++, nid++ ) //读入边,存储到邻接表中
64 {
65 scanf( "%d%d", &i, &j );
66 addEdge( e, i-1, j-1 ); addEdge( e, j-1, i-1 );
67 bridge[nid] = 0;
68 }
69 nbridge = 0; clr(visited);
70 //从顶点 0 出发进行 DFS 搜索,顶点 0 是根结点,所以第 2 个参数为-1
71 DFS( 0, -1, 1 );
72 printf( "%d\n", nbridge ); //输出割边的信息
73
74 /*
75 for( i=0, k=nbridge; i<m; i++ )
76 {
77 if( bridge[i] )
78 {
79 printf( "%d", i+1 );
80 if( --k ) printf( " " );
81 }
82 }
83 */
84 int Y=0;
85 for(i=0;i<m;i++)
86 {
87 if(bridge[i])
88 {
89 if(Y++>0)
90 printf(" ");
91 printf("%d",i+1);
92 }
93 }
94
95 if( nbridge )
96 puts("");
97 if( T )
98 puts("");
99 }
100 return 0;
101 }

Burning Bridges 求tarjan求割边的更多相关文章

  1. HDU 4738 Caocao's Bridges(Tarjan求桥+重边判断)

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

  2. ZOJ 2588 Burning Bridges (tarjan求割边)

    题目链接 题意 : N个点M条边,允许有重边,让你求出割边的数目以及每条割边的编号(编号是输入顺序从1到M). 思路 :tarjan求割边,对于除重边以为中生成树的边(u,v),若满足dfn[u] & ...

  3. ZOJ Problem - 2588 Burning Bridges tarjan算法求割边

    题意:求无向图的割边. 思路:tarjan算法求割边,访问到一个点,如果这个点的low值比它的dfn值大,它就是割边,直接ans++(之所以可以直接ans++,是因为他与割点不同,每条边只访问了一遍) ...

  4. ZOJ 2588 Burning Bridges(求含重边的无向连通图的割边) - from lanshui_Yang

    Burning Bridges Time Limit: 5 Seconds Memory Limit: 32768 KB Ferry Kingdom is a nice little country ...

  5. zoj 2588 Burning Bridges【双连通分量求桥输出桥的编号】

    Burning Bridges Time Limit: 5 Seconds      Memory Limit: 32768 KB Ferry Kingdom is a nice little cou ...

  6. tarjan求割点与割边

    tarjan求割点与割边 洛谷P3388 [模板]割点(割顶) 割点 解题思路: 求割点和割点数量模版,对于(u,v)如果low[v]>=dfn[u]那么u为割点,特判根结点,若根结点子树有超过 ...

  7. 【NOIP训练】【Tarjan求割边】上学

    题目描述 给你一张图,询问当删去某一条边时,起点到终点最短路是否改变. 输入格式 第一行输入两个正整数,分别表示点数和边数.第二行输入两个正整数,起点标号为,终点标号为.接下来行,每行三个整数,表示有 ...

  8. Tarjan 强连通分量 及 双联通分量(求割点,割边)

    Tarjan 强连通分量 及 双联通分量(求割点,割边) 众所周知,Tarjan的三大算法分别为 (1)         有向图的强联通分量 (2)         无向图的双联通分量(求割点,桥) ...

  9. Tarjan在图论中的应用(二)——用Tarjan来求割点与割边

    前言:\(Tarjan\) 求割点和割边建立在 \(Tarjan\)算法的基础之上,因此建议在看这篇博客之前先去学一学\(Tarjan\). 回顾\(Tarjan\)中各个数组的定义 首先,我们来回顾 ...

随机推荐

  1. linux各文件夹的作用-(转自玉米疯收)

    linux下的文件结构,看看每个文件夹都是干吗用的 /bin 二进制可执行命令 /dev 设备特殊文件 /etc 系统管理和配置文件 /etc/rc.d 启动的配置文件和脚本 /home 用户主目录的 ...

  2. Django 自定义表名和字段名

    Django 自定义表名和字段名 通过db_table和db_column自定义数据表名和字段名 假如你的数据库里已经有了一张数据表,且该表包含多个字段,你希望通过Django直接访问该数据表的各个字 ...

  3. 根据某个数据 来筛选 DataTree 分支数里面的数据是否符合规则 进行筛选分支,展示

    问题:如何在 DataTree 树形数据里每个分支里根据特定某个元素值,然后挑选出来 思路:先把分支提取出来,每个都要进行判断. 主要用到的电池: >.Cull Pattern 拓展资料:以下是 ...

  4. 多平台Gstreamer Multiplatform

    多平台Gstreamer Multiplatform GStreamer可在所有主要操作系统上运行,例如Linux,Android,Windows,Max OS X,iOS,以及大多数BSD,商业Un ...

  5. gst-crypto GStreamer插件

    gst-crypto GStreamer插件 内容 1. gst-crypto概述 1.1gst-crypto GStreamer插件功能 1.2用例范例 2. GStreamer插件支持 3. 在本 ...

  6. 浅谈Gson和fastjson使用中的坑

    相信大家在代码编写中都用过Gson和fastjson吧,用来进行 Java对象和json字符串之间的转换. 本篇文章就主要介绍博主在工作中使用这两款工具时遇到的坑和对应的解决办法. 觉得有用的可以点个 ...

  7. jmeter链接mysql数据库

    一.下载与MySQL对应的jar包 1.1.查询MySQL的版本, 命令语句 :SELECT VERSION(); 1.2.MySQL官网下载jar包 ,https://downloads.mysql ...

  8. selenium-python元素定位技巧(一)

    在python-selenium元素定位中,有很多小技巧,在此记录总结 技巧一.尽量不要用可见的文本去定位 尽量不要用可见的文本去定位(特别是支持国际化的软件-比如禅道),因为一旦切换语言后,使用该方 ...

  9. Spring Cloud系列(一):服务注册中心

    一.Spring Cloud简介 Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线).分布式系统的协调导致了样 ...

  10. SpringCloud Alibaba实战(5:子模块基本业务开发)

    源码地址:https://gitee.com/fighter3/eshop-project.git 持续更新中-- 在上一节里,我们搭建了一个微服务项目的整体架构,并进行了版本控制. 接下来我们进一步 ...