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 ...
随机推荐
- SQL Server中各个系统表的作用
sysaltfiles 主数据库 保存数据库的文件 syscharsets 主数据库 字符集与排序顺序 s ...
- 《how to design programs》9.3处理任意长度的表
假定一个玩具商店要把货物库存清单存放在计算机之中,这样,店里的员工就可以快速判断商店里是否还有某种玩具存货.简言之,商店需要一个能够检查库存是否含有玩具'doll 的函数contains-doll?, ...
- 关于清晰讲解linux正则表达式的博文分享
http://www.cnblogs.com/chengmo/archive/2010/10/10/1847287.html linux shell 正则表达式(BREs,EREs,PREs)差异比 ...
- 【LeetCode练习题】Longest Valid Parentheses
Longest Valid Parentheses Given a string containing just the characters '(' and ')', find the length ...
- OpenStack high-level Functionsenabled
- OC基础13:数字、字符串和集合2
"OC基础"这个分类的文章是我在自学Stephen G.Kochan的<Objective-C程序设计第6版>过程中的笔记. 17.Foundation框架的数组是有序 ...
- 卸载mysql残留
一.在控制面板中查看是否有mysql,有则进行卸载.或执行同样版本号的mysql安装文件,选择"remove"进行卸载. 二.卸载mysql后其服务仍在,解决的方法: 点击&quo ...
- centos6.2+nginx-1.2.3+php-5.3.17安装脚本
#!/bin/bash # # vm test install script # # create by xk # # data 2013-04-25 # # SOFTPATH=/home/tools ...
- 【Android】Android实现截取当前屏幕图片并保存至SDCard
功能 1. 实现截取当前屏幕的功能. 2. 把截取的图片保存到SDCard中的某个目录文件夹下面. Java代码 package com.app.test01; import java.io.File ...
- 计算(a/b)%c
如果b与c互素,则(a/b)%c=a*b^(phi(c)-1)%c 如果b与c不互素,则(a/b)%c=(a%bc)/b 对于b与c互素和不互素都有(a/b)%c=(a%bc)/b成立