模板题——求割点与桥

题意,要使一个无向图不连通,输出必定要删掉的边的数量及其编号。求桥的裸题,可拿来练手。

套模板的时候注意本题两节点之间可能有多条边,而模板是不判重边的,所以直接套模板的话,会将重边也当做桥输出,因此要在判断桥的时候加一个判断,即当且仅当两点之间仅有一条边,且满足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的更多相关文章

  1. ZOJ 2588 Burning Bridges(求桥的数量,邻接表)

    题目地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2588 Burning Bridges Time Limit: 5 ...

  2. ZOJ 2588 Burning Bridges(求含重边的无向连通图的割边) - from lanshui_Yang

    Burning Bridges Time Limit: 5 Seconds Memory Limit: 32768 KB Ferry Kingdom is a nice little country ...

  3. zoj 2588 Burning Bridges【双连通分量求桥输出桥的编号】

    Burning Bridges Time Limit: 5 Seconds      Memory Limit: 32768 KB Ferry Kingdom is a nice little cou ...

  4. ZOJ 2588 Burning Bridges(无向连通图求割边)

    题目地址:ZOJ 2588 由于数组开小了而TLE了..这题就是一个求无向连通图最小割边.仅仅要推断dfn[u]是否<low[v],由于low指的当前所能回到的祖先的最小标号,增加low[v]大 ...

  5. ZOJ 2588 Burning Bridges (tarjan求割边)

    题目链接 题意 : N个点M条边,允许有重边,让你求出割边的数目以及每条割边的编号(编号是输入顺序从1到M). 思路 :tarjan求割边,对于除重边以为中生成树的边(u,v),若满足dfn[u] & ...

  6. zoj——2588 Burning Bridges

    Burning Bridges Time Limit: 5 Seconds      Memory Limit: 32768 KB Ferry Kingdom is a nice little cou ...

  7. ZOJ 2588 Burning Bridges 割边(处理重边)

    <题目链接> 题目大意: 给定一个无向图,让你尽可能的删边,但是删边之后,仍然需要保证图的连通性,输出那些不能被删除的边. 解题分析: 就是无向图求桥的题目,主要是提高一下处理重边的姿势. ...

  8. zoj 2588 Burning Bridges(割边/桥)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1588 题意:Ferry王国有n个岛,m座桥,每个岛都可以互达,现在要 ...

  9. zoj 2588 Burning Bridges

    题目描述:Ferry王国是一个漂亮的岛国,一共有N个岛国.M座桥,通过这些桥可以从每个小岛都能到达任何一个小岛.很不幸的是,最近Ferry王国被Jordan征服了.Jordan决定烧毁所有的桥.这是个 ...

随机推荐

  1. 用Log4Net记录NHibernate中执行的SQL语句及执行时间

    首页,在web.config中加入以下配置: <configuration> <configSections> <section name="log4net&q ...

  2. 【转】如何分析解决Android ANR

    来自: http://blog.csdn.net/tjy1985/article/details/6777346 http://blog.csdn.net/tjy1985/article/detail ...

  3. Study notes for Clustering and K-means

    1. Clustering Analysis Clustering is the process of grouping a set of (unlabeled) data objects into ...

  4. VS 统计代码行数

    使用正则表达式 :    ^:b*[^:b#/]+.*$ 简单说明如下: ^:行头 $:行尾 +:一个或多个 *:0个或多个 :b:表示空白,匹配空格或者制表符 # 表示后面是include,/表示注 ...

  5. 【ArcGIS 10.2新特性】Portal for ArcGIS新特性

    1.概述 经过各版本的积累和更新,Portal for ArcGIS在ArcGIS10.2中以正式产品的形态加入到了ArcGIS系列产品线中.它有3个主要定位:协同管理平台.在线制图平台以及内容管理平 ...

  6. WEB的相关知识总结

    JS-->OOP/Module, DOM, JSON, AJAX------------------><script>, script.js的内容 HTML/JS/CSS HT ...

  7. IOS触摸事件和手势识别

    IOS触摸事件和手势识别 目录 概述 触摸事件 手势识别 概述 为了实现一些新的需求,我们常常需要给IOS添加触摸事件和手势识别 触摸事件 触摸事件的四种方法 -(void)touchesBegan: ...

  8. MySQL--索引条件下推优化

    http://blog.163.com/li_hx/blog/static/1839914132015782821512/ 一 什么是“索引条件下推” “索引条件下推”,称为 Index Condit ...

  9. IPC——信号

    Linux进程间通信——使用信号 一.什么是信号 用过Windows的我们都知道,当我们无法正常结束一个程序时,可以用任务管理器强制结束这个进程,但这其实是怎么实现的呢?同样的功能在Linux上是通过 ...

  10. Win7 IE故障:APPCRASH,d3d9.dll,c0000005

    问题:        今天使用使用IE登录某网址,发现总是报错,如下图,无法浏览.         解决方案:       主要讲IE的呈现方案修改即可,如下步骤:       在IE的[Intern ...