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. Netperf测试技巧

    Netperf测试技巧   Netperf测试技巧 1.概况 Netperf是一种网络性能的测量工具,主要针对基于TCP或UDP的传输.Netperf根据应用的不同,可以进行不同模式的网络性能测试,即 ...

  2. 分布式存储ceph---ceph添加/删除osd(5)

    一.添加osd 当前ceph集群中有如下osd,现在准备新添加osd: 1.选择一个osd节点,添加好新的硬盘: 2.显示osd节点中的硬盘,并重置新的osd硬盘: 列出节点磁盘:ceph-deplo ...

  3. Markdown 使用文档

    MarkDown 简介 Markdown 是一种轻量级的「标记语言」,它的优点很多,目前也被越来越多的写作爱好者,撰稿者广泛使用.看到这里请不要被「标记」.「语言」所迷惑,Markdown 的语法十分 ...

  4. 如何设置 web 项目打开的默认页面

    引言 我们在创建 Web 项目启动 Tomcat 会自动打开一个默认 index.jsp 页面,这个页面是创建 Web 项目时就自动生成的.那么,如何设置 web 项目打开的这个的默认页面,改为自己的 ...

  5. 8.模块定义导入优化time datetime内置模块

    1.模块(module)的定义:本质就是.py的python文件用来从逻辑上组织python代码(变量\函数\类\逻辑:实现一个功能)包(package)的定义:用来从逻辑上组织模块的,本质就是一个文 ...

  6. Python数学建模-01.新手必读

    Python 完全可以满足数学建模的需要. Python 是数学建模的最佳选择之一,而且在其它工作中也无所不能. 『Python 数学建模 @ Youcans』带你从数模小白成为国赛达人. 1. 数学 ...

  7. Qt 进度条

    一.前言 有时我们需要在表格(QTableWidget).树状栏(QTreeWidget)中直观显示任务进度或消耗百分比,达到报表显示的形式,可通过重写QLabel的方式实现. 1.进度条控件功能 1 ...

  8. 解决Maven资源过滤

    <build> <resources> <resource> <directory>src/main/java</directory> &l ...

  9. descriptor 'decode' requires a 'bytes' object but received a 'NoneType'

    记录在使用python过程中踩的坑------ 使用xlwt库对excel文件进行保存时报错 descriptor 'decode' requires a 'bytes' object but rec ...

  10. springboot 优雅的启动类

    优雅的sprongboot启动类 package fama.cost.server; import fama.cost.common.IStoppable; import fama.cost.comm ...