【求无向图的桥,有重边】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决定烧毁所有的桥.这是个 ...
随机推荐
- C# List 中 Find 方法
实例化一个集合 List<User> userCollection = new List<User>(); userCollection.Add(new User(1, &qu ...
- Xcode 快捷键操作
菜单栏 桌面 dock 不同应用的菜单栏始终出现在桌面最左上部 commond +shift+y 显示那个XCODE的调试框口 commond +R 运行 commond +,是个性设置,对于任何一 ...
- URAL 1233 - Amusing Numbers
首先计算出k至少为第几位,如果m小于这个数,那么输出0 还有一种情况, 就是10的i次方的这种情况,如果i+1等于m,那么直接输出k,否则输出0 其他的情况,就是二分,然后判断计算其插入到k之前的数的 ...
- 个推推送Android问题检测
1.获取不到CID问题: 1. 查看配置文件是否有问题,appkey.appsecret.appid是否有空格存在. 2. 相关权限是否全部添加. 3. manifest ...
- Java常见排序算法之直接选择排序
在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...
- 【S16】了解如何把vector和string数据传给旧的API
1.尽量使用vector和string替换数组,但是老的代码还是使用数组.如果老的接口期望是数组,怎么办? 需要把vector和string,暴露出数组接口,也就是第一个元素的地址. 2.考虑方法Do ...
- jquery禁用右键、文本选择功能、复制按键的实现
同时适合IE.firefox.谷歌浏览器下适用,经过筛选代码如下 //禁用右键.文本选择功能.复制按键 $(document).bind(“contextmenu”,function(){return ...
- This is your life , in Winbledon , interview Roger Federer
http://v.youku.com/v_show/id_XNTc2Nzg5MTMy.html?firsttime=119 Roger Federer this is you life how mu ...
- onConfigurationChanged is not called&& 翻转屏幕不执行onConfigurationChanged方法&&onConfigurationChanged不执行
我总结出一句话: 如果target sdk>=13,必须使用如下方式声明activity:android:configChanges="orientation|screenSize&q ...
- png图片那点事
PNG图片格式现在包含三种类型: 1.PNG8 256色PNG的别名 2.PNG24 全色PNG的别名 3.PNG32 全色PNG的别名 基本上PNG32就是PNG24,但 ...