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\)中各个数组的定义 首先,我们来回顾 ...
随机推荐
- 070.Python聚焦爬虫数据解析
一 聚焦爬虫数据解析 1.1 基本介绍 聚焦爬虫的编码流程 指定url 基于requests模块发起请求 获取响应对象中的数据 数据解析 进行持久化存储 如何实现数据解析 三种数据解析方式 正则表达式 ...
- Linux_进程之间的通信
一.进程间的通信 1️⃣:进程间通信(IPC:Inter Process Communication) 2️⃣:进程之间通信方式: 同一主机 共享内存 信号:Signal 不同主机 rpc:remot ...
- ZooKeeper IDEA 可视化管理插件安装
1. 安装 zookeeper 插件 打开 IDEA->Settings->Plugins,然后在 Marketplace 输入 "zookeeper" 如下: 插件安 ...
- 055.Python前端Django模型ORM
由于前面在centos实验的过程中,pymql一直有属性错误,很难排查出问题,重新做了一个ubuntu的桌面系统同时使用pycharm开发工具作为学习开发工具,具体原因是因为在项目命名出现问题,和自己 ...
- 网上的说TB6560存在的问题
https://www.amobbs.com/thread-5506456-2-1.html
- 安全漏洞扫描工具 burpsuite V1.7.32 资料
安装包下载地址:http://www.downxia.com/downinfo/229728.html 实战教程:https://t0data.gitbooks.io/burpsuite/conten ...
- 矩阵中的路径 DFS+剪枝
给定一个 m x n 二维字符网格 board 和一个字符串单词 word .如果 word 存在于网格中,返回 true :否则,返回 false . 单词必须按照字母顺序,通过相邻的单元格内的字母 ...
- NCF 如何通过WebApi实现前后端分离
简介 昨天参加了<Best Of Microsoft Build>上海专场 NCF 模块化 WebApi 系统开发 + 容器化部署实战 的小伙伴们,昨天有些没有记住的,今天我在这里给大家把 ...
- Linux 中的 守护进程
什么是守护进程 脱离控制终端的,运行于后端的进程,由系统管理的,按计划自动启动/停止/重启,用以执行特定的任务. 为什么要有守护进程? 在某些需求场景下,我们希望某项系统任务能够按计划按预期,始终/自 ...
- Go语言流程控制03--goto跳转到任意标签位置
package main import ( "fmt" "time" ) func main() { STUDYHARD: fmt.Println(" ...