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如何设置用户登录超时(闲置时间)vi /etc/profile ... export TMOUT=900

    Linux如何设置用户登录超时(闲置时间) 转载莫负寒夏ai 最后发布于2019-08-08 15:04:22 阅读数 1897  收藏 展开 1. 针对所有用户 # vi /etc/profile ...

  2. linux服务之FTP服务篇

    一.FTP协议 FTP服务器(File Transfer Protocol Server)是在互联网上提供文件存储和访问服务的计算机,它们依照FTP协议提供服务. FTP (File Transfer ...

  3. 11.7 iostat: I/O信息统计

    iostat是I/O statistics(输入/输出统计)的缩写,其主要功能是对系统的磁盘I/O操作进行监视.它的输出主要是显示磁盘读写操作的统计信息,同时也会给出CPU的使用情况.同vmstat命 ...

  4. 6.3-4 zip、unzip

    zip:打包和压缩文件     zip压缩格式是Windows与Linux等多平台通用的压缩格式.和gzip命令相比,zip命令压缩文件不仅不会删除源文件,而且还可以压缩目录.   zip命令的参数选 ...

  5. svg 飞线,源码

    <html> <head> <meta charset="utf-8" /> <meta name="viewport" ...

  6. 使用Tomcat插件控制台中文乱码解决方案(IDEA)(Day_51)

    解决方案 1. File -> Settings... 2. 搜索 Runner (运行程序),在 'VM options:' 中添加:-Dfile.encoding=GB2312 注:GB23 ...

  7. java和kotlin的可见性修饰符对比

    private 意味着只在这个类内部(包含其所有成员)可见: protected-- 和 private一样 + 在子类中可见. internal -- 能见到类声明的 本模块内 的任何客户端都可见其 ...

  8. ubuntu下 SVN 服务器搭建及使用

    简化篇 http://blog.csdn.net/Eric_lmy/article/details/51942931 详细篇 1.安装Subversion ServerSubversion serve ...

  9. Django(46)drf序列化类的使用(ModelSerializer)

    前言 我们上篇文章使用到了Serializer类,可能有小伙伴说太过复杂,那么本篇就为大家带来更加简便的序列化类ModelSerializer ModelSerializer 先来看下ModelSer ...

  10. CUDA刷新:GPU计算生态系统

    CUDA刷新:GPU计算生态系统 CUDA Refresher: The GPU Computing Ecosystem 这是CUDA Refresher系列的第三篇文章,其目标是刷新CUDA中的关键 ...