zoj2588 Burning Bridges(无向图的桥)
题目大意:给一张无向图,现在要去掉一些边,使图仍然连通,求不能去掉的边。
题目分析:就是求无向图的桥。
tarjan算法跑一遍,和无向图割点十分类似,这里要找low[v] > dfn[u]的边(u,v)便是割边,因为v是u的孩子,但是v无法访问到u的祖先,那么断开这条边原图必不连通,因此这是桥。这题会有平行边,平行边必定不是桥。所以dfs的时候要判断一下。
详情请见代码:
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 10005;
const int M = 500005;
int m,n,num,ansnum,dfns;
int head[N],ans[M],low[N],dfn[N];
bool vis[N];
struct node
{
int to,next,id;
}bridge[M<<1];
void build(int s,int e,int id)
{
bridge[num].id = id;
bridge[num].to = e;
bridge[num].next = head[s];
head[s] = num ++;
}
void dfs(int cur,int fa)
{
vis[cur] = true;
int chongbian = 0;
dfn[cur] = low[cur] = dfns ++;
for(int i = head[cur];i != -1;i = bridge[i].next)
{
if(fa == bridge[i].to)
chongbian ++;
if(vis[bridge[i].to] == false)
{
dfs(bridge[i].to,cur);
low[cur] = min(low[cur],low[bridge[i].to]);
if(low[bridge[i].to] > dfn[cur])
ans[ansnum ++] = bridge[i].id;
}
else if(fa != bridge[i].to || chongbian > 1)
low[cur] = min(low[cur],dfn[bridge[i].to]);
}
}
void tarjan()
{
int i;
dfns = 1;
memset(vis,false,sizeof(vis));
memset(dfn,0,sizeof(dfn));
for(i = 1;i <= n;i ++)
if(vis[i] == false)
dfs(i,-1);
printf("%d\n",ansnum);
sort(ans,ans + ansnum);
for(i = 0;i < ansnum;i ++)
printf(i == ansnum - 1?"%d\n":"%d ",ans[i]);
}
int main()
{
int t,i;
int a,b;
scanf("%d",&t);
while(t --)
{
scanf("%d%d",&n,&m);
memset(head,-1,sizeof(head));
num = ansnum = 0;
for(i = 1;i <= m;i ++)
{
scanf("%d%d",&a,&b);
build(a,b,i);
build(b,a,i);
}
tarjan();
if(t)
puts("");
}
return 0;
}
zoj2588 Burning Bridges(无向图的桥)的更多相关文章
- ZOJ2588 Burning Bridges 无向图的割边
题目大意:求无向图的割边编号. 割边定义:在一个连通图中,如果删去一个边e,图便变成不连通的两个部分,则e为该图的割边. 求法:边(u,v) 不是割边,当且仅当边(u,v)在一个环内.因此所有不在环内 ...
- ZOJ2588 Burning Bridges(割边模板)
题目要输出一个无向图的所有割边.用Tarjan算法: 一遍DFS,构造出一颗深度优先生成树,在原无向图中边分成了两种:树边(生成树上的边)和反祖边(非生成树上的边). 顺便求出每个结点的DFS序dfn ...
- HDU4738 Caocao's Bridges 无向图的桥
一眼题:找所有的桥,然后求最小权值 但是有很多坑点 1:如果本来不联通 输出0,(这个坑我知道) 2:但是还有一个坑,就是当整个连通,最小桥的权值是0时,也必须派一个人去,wa了无数遍(还是太年轻) ...
- zoj2588 Burning Bridges --- 寻求尖端
#include <iostream> #include <cstring> #include <string> #include <cstdio> # ...
- zoj 2588 Burning Bridges【双连通分量求桥输出桥的编号】
Burning Bridges Time Limit: 5 Seconds Memory Limit: 32768 KB Ferry Kingdom is a nice little cou ...
- ZOJ 2588 Burning Bridges(求桥的数量,邻接表)
题目地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2588 Burning Bridges Time Limit: 5 ...
- HDU 4738--Caocao's Bridges(重边无向图求桥)
Caocao's Bridges Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- ZOJ 2588 Burning Bridges(求含重边的无向连通图的割边) - from lanshui_Yang
Burning Bridges Time Limit: 5 Seconds Memory Limit: 32768 KB Ferry Kingdom is a nice little country ...
- xtu summer individual 5 E - Burning Bridges
Burning Bridges Time Limit: 5000ms Memory Limit: 32768KB This problem will be judged on ZJU. Origina ...
随机推荐
- python 数据类型之数float
1.float 对象有一个重要的方法is_intger.如果这个float对应在转化为int时不会有精度的丢失就返回True,不然就返回False #!/usr/bin/python #!coding ...
- SQL Server 与 Windows 内存使用上的约定
什么时候SQL Server 会释放出自己的内存!以提供给别的程序用呢? --------------------------------------------------------------- ...
- QtWaitingSpinner
https://github.com/snowwlex/QtWaitingSpinner
- Table XXX is marked as crashed and should be repaired问题
数据表出错了,查询数据获取不到了. 尝试一 重启mysql service mysqld restart 没用,重启并没有把表修复掉 尝试二 check table vicidial_list;rep ...
- python图片小爬虫
import re import urllib import os def rename(name): name = name + '.jpg' return name def getHtml(url ...
- linux之SQL语句简明教程---TRIM
SQL 中的 TRIM 函数是用来移除掉一个字串中的字头或字尾.最常见的用途是移除字首或字尾的空白.这个函数在不同的资料库中有不同的名称: MySQL: TRIM( ), RTRIM( ), LTRI ...
- 【LeetCode练习题】Linked List Cycle II
Linked List Cycle Given a linked list, determine if it has a cycle in it. Follow up:Can you solve it ...
- Makefile里调用Shell注意点
http://www.linuxidc.com/Linux/2012-04/59093.htm 大家经常编写和使用Makefile, Makefile里面也经常用到shell, 但对其中一些需要注意的 ...
- 3、使用Lucene实现千度搜索
1.新建Web项目 新建一个Web项目,我命名为SearchEngine,然后导入Java包: 除了上篇博客中的Jar包外,我还引入了 IKAnalyzer2012_FF.jar 包和struts2的 ...
- 【iOS开发-35】有了ARC内存管理机制,是否还须要操心内存溢出等问题?——面试必备
答案:必需要操心啊,ARC也不是万能的. 这里主要是涉及到集合类的数据类型. 比方数组,我们定义了一个可变数组muarr1,然后把一个对象p1加到muarr1中,此时会对这个对象retain一次,相当 ...