【求无向图的桥,有重边】ZOJ - 2588 Burning Bridges
模板题——求割点与桥
题意,要使一个无向图不连通,输出必定要删掉的边的数量及其编号。求桥的裸题,可拿来练手。
套模板的时候注意本题两节点之间可能有多条边,而模板是不判重边的,所以直接套模板的话,会将重边也当做桥输出,因此要在判断桥的时候加一个判断,即当且仅当两点之间仅有一条边,且满足dfn[cur] < low[i],(cur, i)才是桥。
另外本题节点数为105,用邻接矩阵的话会内存超限,所以我用了了一个multiset存储边及其编号。
代码如下:
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<vector>
#include<set>
#include<algorithm>
#include<iostream>
using namespace std;
const int MAX_V = ;
const int MAX_E = ;
struct Edge
{
int to, id;
Edge() {}
Edge(int _t, int _i):to(_t), id(_i) {}
bool operator < (const Edge& rhs) const
{
return to < rhs.to;
}
};
multiset<Edge> edge[MAX_V];
multiset<int> tms[MAX_V];
vector<int> ans;
int vis[MAX_V]; //结点v当前访问状态,0表示未访问,1表示在栈中,2表示已经访问过
int dfn[MAX_V]; //结点v被访问时的深度
int low[MAX_V]; //结点v可以到达的访问时间最早的祖先的深度
void cut_bridge(int cur, int father, int dep, int n) //vertex: 0~n-1
{
vis[cur] = ;
dfn[cur] = dep;
low[cur] = dep;
int children = ;
int sz = edge[cur].size();
for(multiset<Edge>::iterator it = edge[cur].begin(); it != edge[cur].end(); it++)
{
int id = (*it).id;
int i = (*it).to;
if(i != father && vis[i] == ) //i在当前栈中,说明图中有一个环,用i的深度更新cur的low值;
{
if(dfn[i] < low[cur]) low[cur] = dfn[i]; //将结点cur可以到达的访问时间最早的祖先的深度更新为结点i被访问时的深度;
}
if(vis[i] == ) //i没被访问过,递归访问节点i,并用i的可以到达的最早祖先来更新cur的low值;
{
cut_bridge(i, cur, dep+, n);
if(low[i] < low[cur]) low[cur] = low[i];
if(low[i] > dfn[cur] && tms[cur].count(i) == )
{
ans.push_back(id);
}//判断桥
}
}
vis[cur] = ;
}
void init(int n)
{
ans.clear();
memset(vis, , sizeof(vis));
for(int i = ; i <= n; i++)
{
edge[i].clear();
tms[i].clear();
}
}
int main()
{
int T;
scanf("%d", &T);
for(int kase = ; kase < T; kase++)
{
if(kase) printf("\n");
int n, m;
scanf("%d%d", &n, &m);
init(n);
for(int i = ; i < m; i++)
{
int u, v;
scanf("%d%d", &u, &v);
Edge e1(v, i+), e2(u, i+);
edge[u].insert(e1);
edge[v].insert(e2);
tms[u].insert(v);
tms[v].insert(u);
}
for(int i = ; i <= n; i++)
if(vis[i] == )
cut_bridge(i, -, , n); sort(ans.begin(), ans.end());
printf("%d\n", ans.size());
for(int i = ; i < ans.size(); i++)
{
if(i) printf(" ");
printf("%d", ans[i]);
}
if(ans.size()) printf("\n");
}
return ;
}
ZOJ 2588
【求无向图的桥,有重边】ZOJ - 2588 Burning Bridges的更多相关文章
- ZOJ 2588 Burning Bridges(求桥的数量,邻接表)
题目地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2588 Burning Bridges Time Limit: 5 ...
- 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【双连通分量求桥输出桥的编号】
Burning Bridges Time Limit: 5 Seconds Memory Limit: 32768 KB Ferry Kingdom is a nice little cou ...
- ZOJ 2588 Burning Bridges(无向连通图求割边)
题目地址:ZOJ 2588 由于数组开小了而TLE了..这题就是一个求无向连通图最小割边.仅仅要推断dfn[u]是否<low[v],由于low指的当前所能回到的祖先的最小标号,增加low[v]大 ...
- ZOJ 2588 Burning Bridges (tarjan求割边)
题目链接 题意 : N个点M条边,允许有重边,让你求出割边的数目以及每条割边的编号(编号是输入顺序从1到M). 思路 :tarjan求割边,对于除重边以为中生成树的边(u,v),若满足dfn[u] & ...
- 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(割边/桥)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1588 题意:Ferry王国有n个岛,m座桥,每个岛都可以互达,现在要 ...
- zoj 2588 Burning Bridges
题目描述:Ferry王国是一个漂亮的岛国,一共有N个岛国.M座桥,通过这些桥可以从每个小岛都能到达任何一个小岛.很不幸的是,最近Ferry王国被Jordan征服了.Jordan决定烧毁所有的桥.这是个 ...
随机推荐
- [转]Kerberos简介
Kerberos协议: Kerberos协议主要用于计算机网络的身份鉴别(Authentication), 其特点是用户只需输入一次身份验证信息就可以凭借此验证获得的票据(ticket-grantin ...
- VC++中几种字符标志的解释
VC++中几种字符标志的解释 LPSTR = char * LPCSTR = const char * LPWSTR = wchar_t * LPCWSTR = const wchar_t * LPO ...
- wpf图片切换,幻灯效果
xaml: <Window x:Class="WpfApplication1.PicShow" xmlns="http://schemas.microsoft.co ...
- Array--Good parts
js数组没有上届 --如果你用大于或等于当前length的数字作为下标来存储一个元素,那么length会被增大以容纳新元素,不会发生数组越界. 数组也是对象 --可以添加属性.a["name ...
- 转载:Erlang 资源
Erlang资源 erlang豆瓣广播
- IP路由协议简析
RIP 路由信息协议 IGRP 内部网关协议 EIGRP 增强型内部网关路由协议 OSPF 开放最短路径优先 3种动态路由: 距离矢量:RIP/RIPv2 IGRP EIGRP 链路状态:OSP ...
- 给Oracle锁住的行解锁
1.找出数据库的serial#,以备杀死: select t2.username,t2.sid,t2.serial#,t2.logon_time from v$locked_object t1,v$s ...
- Pgpool烂泥扶不上墙
写这篇文章,是想好心地给打算使用Pgpool的人提个醒: Pgpool 真的不适合在企业范围使用. 我的主要理由是: 设计陈旧: 一旦后台任何节点Down掉,都会引发failover,它会杀掉所有子进 ...
- ARM&Linux 下驱动开发第一节(小试牛刀)
#include<linux/init.h> #include<linux/module.h> static int __init hello_init(void) { pri ...
- 使用Python脚本进行域名解析
因为在研究爬虫,所以也了解了下域名解析.要提高爬虫的效率,就需要提高域名解析的效率.我将爬虫记录下的域名作为待解析的域名来测试各域名解析方法的效率.我尝试以下四种方法:1. 单线程依次解析各域名,2. ...