Burning Bridges 求tarjan求割边
给出含有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求割边的更多相关文章
- HDU 4738 Caocao's Bridges(Tarjan求桥+重边判断)
Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- ZOJ 2588 Burning Bridges (tarjan求割边)
题目链接 题意 : N个点M条边,允许有重边,让你求出割边的数目以及每条割边的编号(编号是输入顺序从1到M). 思路 :tarjan求割边,对于除重边以为中生成树的边(u,v),若满足dfn[u] & ...
- ZOJ Problem - 2588 Burning Bridges tarjan算法求割边
题意:求无向图的割边. 思路:tarjan算法求割边,访问到一个点,如果这个点的low值比它的dfn值大,它就是割边,直接ans++(之所以可以直接ans++,是因为他与割点不同,每条边只访问了一遍) ...
- ZOJ 2588 Burning Bridges(求含重边的无向连通图的割边) - from lanshui_Yang
Burning Bridges Time Limit: 5 Seconds Memory Limit: 32768 KB Ferry Kingdom is a nice little country ...
- zoj 2588 Burning Bridges【双连通分量求桥输出桥的编号】
Burning Bridges Time Limit: 5 Seconds Memory Limit: 32768 KB Ferry Kingdom is a nice little cou ...
- tarjan求割点与割边
tarjan求割点与割边 洛谷P3388 [模板]割点(割顶) 割点 解题思路: 求割点和割点数量模版,对于(u,v)如果low[v]>=dfn[u]那么u为割点,特判根结点,若根结点子树有超过 ...
- 【NOIP训练】【Tarjan求割边】上学
题目描述 给你一张图,询问当删去某一条边时,起点到终点最短路是否改变. 输入格式 第一行输入两个正整数,分别表示点数和边数.第二行输入两个正整数,起点标号为,终点标号为.接下来行,每行三个整数,表示有 ...
- Tarjan 强连通分量 及 双联通分量(求割点,割边)
Tarjan 强连通分量 及 双联通分量(求割点,割边) 众所周知,Tarjan的三大算法分别为 (1) 有向图的强联通分量 (2) 无向图的双联通分量(求割点,桥) ...
- Tarjan在图论中的应用(二)——用Tarjan来求割点与割边
前言:\(Tarjan\) 求割点和割边建立在 \(Tarjan\)算法的基础之上,因此建议在看这篇博客之前先去学一学\(Tarjan\). 回顾\(Tarjan\)中各个数组的定义 首先,我们来回顾 ...
随机推荐
- Linux 用 ps 與 top 指令找出最耗費 CPU 與記憶體資源的程式最占cpu的进程
Linux 用 ps 與 top 指令找出最耗費 CPU 與記憶體資源的程式 2016/12/220 Comments ######### ps -eo pid,ppid,%mem,%cpu,cmd ...
- 强哥PHP面向对象学习笔记
面向对象编程OOP目标:重用性.灵活性.扩展性特点:封装.继承.多态 类的书写方法:class PersionName{} 特征:属性.其实就是变量行为:方法.其实就是函数 1.实例化对象2.对象中成 ...
- 使用chrony安装chrony
yum install chrony -y 使用chrony安装chrony 使用root用户登录~]# yum install chrony 默认的chrony进程位置/usr/sbin/c ...
- 文本编辑_Vim&Vi
一.Vim.Vi文本编辑器 1️⃣:vi: Visual Interface,文本编辑器 2️⃣:文本:ASCII, Unicode 3️⃣:VIM - Vi IMproved 二.Vim.vi的特点 ...
- 035.Python正则表达式
正则表达式 一 介绍 拼正则表达式是什么? 它是约束字符串匹配某种形式的规则 正则表达式有什么用? 检测某个字符串是否符合规则比如:判断手机号,身份证号是否合法 提取网页字符串中想要的数据.比如:爬虫 ...
- MVC RadioButton控件
@Html.RadioButtonFor(m => m.IfValid, 1, new { @id = "radio1", @name = "rdolstState ...
- linux系统ifconfig中网卡名和网卡配置文件名称不同的解决办法
比如我的配置文件, cd /etc/sysconfig/network-scripts/ifcfg-eth1是这个名称,但是我使用ifconfig显示的信息却是 eth0,很明显这不是我配置文件的名称 ...
- K8s之二进制安装高可用集群
1.环境准备 #二进制部署安装文档# https://github.com/easzlab/kubeasz/blob/master/docs/setup/00-planning_and_overall ...
- RMAN-06172: no AUTOBACKUP found or specified handle is not a valid copy or piece
问题描述:将备份集从一台主机拷贝到另外一台主机后,在通过RMAN将数据库恢复到同类机异机的时候,restore spfile一直报RMAN-06172: no AUTOBACKUP found or ...
- OpenCV 查找轮廓
本文将结合实例代码,介绍 OpenCV 如何查找轮廓.获取边界框. 代码: contours.py OpenCV 提供了 findContours 函数查找轮廓,需要以二值化图像作为输入.并指定些选项 ...