ZOJ 2588 Burning Bridges (tarjan求割边)
题意 : N个点M条边,允许有重边,让你求出割边的数目以及每条割边的编号(编号是输入顺序从1到M)。
思路 :tarjan求割边,对于除重边以为中生成树的边(u,v),若满足dfn[u] < low[v],则边(u,v)是割边。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std; struct node
{
int u ;
int v;
int next ;
int num ;
}p[];
int dfn[],low[] ;//dfn深度优先遍历生成树的顺序,low表示该节点能够到达的祖先的最小编号
int bridge[] ,nbrid,vis[];//桥的编号,割边的条数,vis表示该点是否访问过
int cnt,head[],tot ; void Init()
{
cnt = nbrid = tot= ;
memset(head,-,sizeof(head)) ;
memset(vis,,sizeof(vis)) ;
}
void addedge(int u,int v,int id)
{
//p[cnt].u = u ;
p[cnt].v = v ;
p[cnt].num = id ;
p[cnt].next = head[u] ;
head[u] = cnt ++ ;
//p[cnt].u = v ;
p[cnt].v = u ;
p[cnt].num = id ;
p[cnt].next = head[v] ;
head[v] = cnt ++ ;
} void DFS(int u,int fu)
{
dfn[u] = low[u] = tot++ ;
vis[u] = ;
for(int i = head[u] ; i != - ; i = p[i].next)
{
int v = p[i].v;
if(p[i].num != fu && vis[v] )
{
low[u] = min(low[u],dfn[v]) ;
}
else if( !vis[v] )
{
DFS(v,p[i].num) ;
low[u] = min(low[u],low[v]) ;
if(low[v] > dfn[u])
{
bridge[++nbrid] = p[i].num;
}
}
}
}
int main()
{
int T ,N,M,u,v;
scanf("%d",&T) ;
while(T--)
{
Init() ;
scanf("%d %d",&N,&M) ;
for(int i = ; i <= M ; i++)
{
scanf("%d %d",&u,&v) ;
addedge(u,v,i) ;
}
DFS(,-) ;
sort(bridge+,bridge++nbrid) ;
printf("%d\n",nbrid) ;
for(int i = ; i <= nbrid ; i++)
{
if(i != nbrid)
printf("%d ",bridge[i]) ;
else printf("%d\n",bridge[i]) ;
}
if(T)puts("") ;
}
return ;
}
鹏哥说我那样写的太丑了,非给我改成下边的样子
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std; struct node
{
int u ;
int v;
int next ;
int num ;
}p[];
int dfn[],low[] ;
int bridge[] ,nbrid,vis[];
int cnt,head[],tot ;
int fb[];
void Init()
{
cnt = nbrid = tot= ;
memset(head,-,sizeof(head)) ;
memset(vis,,sizeof(vis)) ;
memset(fb,,sizeof(fb));
memset(dfn,,sizeof(dfn));
memset(low,,sizeof(low));
}
void addedge(int u,int v,int id)
{
//p[cnt].u = u ;
p[cnt].v = v ;
p[cnt].num = id ;
p[cnt].next = head[u] ;
head[u] = cnt ++ ;
//p[cnt].u = v ;
p[cnt].v = u ;
p[cnt].num = id ;
p[cnt].next = head[v] ;
head[v] = cnt ++ ;
}
void DFS(int u)
{
dfn[u] = low[u] = ++tot;
//vis[u] = 1 ;
for(int i = head[u] ; i != - ; i = p[i].next)
{
int v=p[i].v;
if(fb[i^])continue;
fb[i]=;
if(dfn[v] )//如果该点没被访问过dfn自然为0,所以不用vis数组也可
{
low[u] = min(low[u],dfn[v]) ;
}
else
{
DFS(v) ;
low[u] = min(low[u],low[v]) ;
if(low[v] > dfn[u])
{
bridge[++nbrid] = p[i].num;
}
}
}
}
int main()
{
int T ,N,M,u,v;
scanf("%d",&T) ;
while(T--)
{
Init() ;
scanf("%d %d",&N,&M) ;
for(int i = ; i <= M ; i++)
{
scanf("%d %d",&u,&v) ;
addedge(u,v,i) ;
}
DFS() ;
sort(bridge+,bridge++nbrid) ;
printf("%d\n",nbrid) ;
for(int i = ; i <= nbrid ; i++)
{
if(i != nbrid)
printf("%d ",bridge[i]) ;
else printf("%d\n",bridge[i]) ;
}
if(T)puts("") ;
}
return ;
}
ZOJ 2588 Burning Bridges (tarjan求割边)的更多相关文章
- 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(求桥的数量,邻接表)
题目地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2588 Burning Bridges Time Limit: 5 ...
- zoj——2588 Burning Bridges
Burning Bridges Time Limit: 5 Seconds Memory Limit: 32768 KB Ferry Kingdom is a nice little cou ...
- ZOJ Problem - 2588 Burning Bridges tarjan算法求割边
题意:求无向图的割边. 思路:tarjan算法求割边,访问到一个点,如果这个点的low值比它的dfn值大,它就是割边,直接ans++(之所以可以直接ans++,是因为他与割点不同,每条边只访问了一遍) ...
- ZOJ 2588 Burning Bridges(无向连通图求割边)
题目地址:ZOJ 2588 由于数组开小了而TLE了..这题就是一个求无向连通图最小割边.仅仅要推断dfn[u]是否<low[v],由于low指的当前所能回到的祖先的最小标号,增加low[v]大 ...
- 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
模板题——求割点与桥 题意,要使一个无向图不连通,输出必定要删掉的边的数量及其编号.求桥的裸题,可拿来练手. 套模板的时候注意本题两节点之间可能有多条边,而模板是不判重边的,所以直接套模板的话,会将重 ...
- zoj 2588 Burning Bridges
题目描述:Ferry王国是一个漂亮的岛国,一共有N个岛国.M座桥,通过这些桥可以从每个小岛都能到达任何一个小岛.很不幸的是,最近Ferry王国被Jordan征服了.Jordan决定烧毁所有的桥.这是个 ...
- ZOJ 2588 Burning Bridges 割边(处理重边)
<题目链接> 题目大意: 给定一个无向图,让你尽可能的删边,但是删边之后,仍然需要保证图的连通性,输出那些不能被删除的边. 解题分析: 就是无向图求桥的题目,主要是提高一下处理重边的姿势. ...
随机推荐
- meteor icons & splash配置
ionic resources http://ionicframework.com/docs/cli/icon-splashscreen.html 用一条指令生成ionic生需Icons & ...
- python 生成二维码
#coding:utf8 try: import qrcode except ImportError: qrcode = None class MakeQr: def onUseQrcode(self ...
- android NDK开发环境搭建
android NDK开发环境搭建 2012-05-14 00:13:58 分类: 嵌入式 基于 Android NDK 的学习之旅-----环境搭建 工欲善其事必先利其器 , 下面介绍下 Eclip ...
- Linux 删除mysql数据库失败的解决方法
使用命令:drop database xxx:删除本数据库时却删除失败,系统提示出现了错误,错误代码为: ERROR 1010 (HY000): Error dropping database(can ...
- 随笔 planetest
Camera跟随物体: import Scripts包,Component中的camera control会有smooth follow脚本,添加到Main Camera中,在脚本的target属性中 ...
- GCC常用命令行一览表
GCC常用命令行一览表 这些常用的 gcc/g++ 命令行参数,你都知道么?1. gcc -E source_file.c-E,只执行到预编译.直接输出预编译结果. 2. gcc -S source_ ...
- java中的substring用法
String str="我是中国人"; str = str.substring(0, 2) +"_"+str.substring(3, 4); 结果:str=& ...
- 【Minimum Depth of Binary Tree】cpp
题目: Given a binary tree, find its minimum depth. The minimum depth is the number of nodes along the ...
- Nagios全方位告警接入-电话/微信/短信都支持
百度告警平台地址: http://gaojing.baidu.com 联系我们: 邮箱:gaojing@baidu.com 电话:13924600771 QQ群:183806029 Nagios接入 ...
- Eclipse支持Jquery代码提示(JqeuryWTP)
问题描述: Eclipse支持Jquery代码提示 问题解决: 下载 JqueryWTP.jar文件 文件替换 在Eclipse/plugin 路径下, ...