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 割边(处理重边)
<题目链接> 题目大意: 给定一个无向图,让你尽可能的删边,但是删边之后,仍然需要保证图的连通性,输出那些不能被删除的边. 解题分析: 就是无向图求桥的题目,主要是提高一下处理重边的姿势. ...
随机推荐
- oracle 查看隐含参数脚本
set linesize 132 column name format a30 column value format a25 select x.ksppinm name, y.ksppstvl va ...
- file_get_contents函数和curl函数不能用
某天file_get_contents()突然不能用了,检查了下php配置文件 allow_url_fopen=on 没问题 各种重启也没用 最后在ssh下执行 chmod 755 /etc/re ...
- 如何查看hadoop与hbase的版本匹配关系
官网:http://hbase.apache.org/book.html 搜索:Hadoop version support matrix 下面有一个二维的支持关系表.
- c/c++常用代码--使用libcurl下载文件
#pragma once #include <stdio.h>#include <stdlib.h> #include <curl/curl.h> #ifdef ...
- trap命令使用
分享一个shell脚本技巧,大家写shell脚本的时候,一般而言仅仅保证功能可用,但程序的鲁棒性却不是太好,不够健壮,多数是脚本处理 一些中断信号导致,应对非预期的系统信号,其实系统自带的trap命令 ...
- 四、VMware Tools 安装 与 问题
解决VMware Tools无法安装的问题 虚拟机上装win2kgho版的系统,安装VMware Tools时,遇到“VMware Tools installation cannot be start ...
- Ajaxadr ajax跨域请求crossdomain
最近工作需要用到ajax跨域请求参数,网上找很很久,最终得到解决之道.分享一下吧,希望能帮到各位 也许你已经发现在浏览器直接敲路径能获得对方提供接口的参数,而一到项目中Ajax请求却老是失败.原因是, ...
- Liferay IDE3.1 M1的一些新功能
定于11月发布的Liferay IDE提供了一些让人期许的功能 1. code upgrade tools 这个工具将会帮助你把liferay 6.2的项目升级为7.0的项目.下面列举其主要功能 1. ...
- python解析xml之lxml
虽然python解析xml的库很多,但是,由于lxml在底层是用C语言实现的,所以lxml在速度上有明显优势.除了速度上的优势,lxml在使用方面,易用性也非常好.这里将以下面的xml数据为例,介绍l ...
- 【BZOJ】【4010】【HNOI2015】菜肴制作
拓扑排序 这题是要求N个点的一个拓扑序,且满足以下条件:编号1的位置尽可能靠前,在此基础上编号2的位置尽可能靠前…… 我看到这题的第一感觉:将拓扑排序用的队列改为优先队列,编号越小越早出来. 但是连样 ...