模板题——求割点与桥

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

套模板的时候注意本题两节点之间可能有多条边,而模板是不判重边的,所以直接套模板的话,会将重边也当做桥输出,因此要在判断桥的时候加一个判断,即当且仅当两点之间仅有一条边,且满足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. [p2p]UDP用打洞技术穿透NAT的原理与实现

    首先先介绍一些基本概念:            NAT(Network Address             Translators),网络地址转换:网络地址转换是在IP地址日益缺乏的情况下产生的, ...

  2. javascript数据缓存

    if(!self.hotCityPrice[city]) { $.ajax({ type: 'GET', url: self.hotCityUrl, data: {cityCode: city, t: ...

  3. 大数据平台搭建(hadoop+spark)

    大数据平台搭建(hadoop+spark) 一.基本信息 1. 服务器基本信息 主机名 ip地址 安装服务 spark-master 172.16.200.81 jdk.hadoop.spark.sc ...

  4. APK扩展文件及使用

    转自:http://blog.csdn.net/myarrow/article/details/7760579 一.APK扩展文件基本知识 Android Market (Google Play St ...

  5. cocos2d-x (Android)之-那些常见的error记

    转自:http://blog.csdn.net/callchunli/article/details/8929813 (2013/9/2) build.xml:939: java.lang.Array ...

  6. cocos2d jsb 打包 Android APK

    1.首先要会普通的cpp 打包成Android APK 下面所说的是在cocos2d-x 2.2.2 或者 2.3 版本号中.本文在Eclipse总用ndk编译cocos2d-x. 老生常谈cocos ...

  7. C# 如何编辑文件的摘要信息

    我的以前的测试报告程序需要在倒完测试数据报告后,在文件摘要中加上一些类似版权说明的文字等等. 因此需要对文件摘要信息进行编辑. 我的记忆中以前好像只有office文档才可以又摘要信息, 现在看来基本上 ...

  8. OS_TASK.C

    /*************************************************************************************************** ...

  9. [Angular2 Router] Lazy Load Angular 2 Modules with the Router

    Angular 2 lazy loading is a core feature of Angular 2. Lazy loading allows your application to start ...

  10. CSS样式如何解决IE浏览器不同版本的兼容问题

    如果你想让浏览器是固定的IE6版本,那么你做网页的时候在<head>后面加上一句话: <meta http-equiv="X-UA-Compatible" con ...