题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3394

题目大意:

给定一个无向图,如果从一个点出发经过一些点和边能回到该点本身,那么一路走过来的这些点和边的集合就是一个环。

一个公园中有 n 个景点,景点之间通过无向的道路来连接,如果至少两个环公用一条路,路上的游客就会发生冲突;如果一条路不属于任何的环,这条路就没必要修。

问,有多少路不必修,有多少路会发生冲突?

解题思路:

每一个连通块中,如果边数大于点数,这个块中所有的边全部是冲突边。

所有桥为不需要修建的路。

实现代码如下:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 10010, maxm = 100010;
struct Edge {
int u, v, nxt;
Edge () {};
Edge (int _u, int _v, int _nxt) { u = _u; v = _v; nxt = _nxt; }
} edge[maxm<<1];
int n, m, head[maxn], ecnt;
void init() {
memset(head, -1, sizeof(int)*(n+1));
ecnt = 0;
}
void addedge(int u, int v) {
edge[ecnt] = Edge(u, v, head[u]); head[u] = ecnt ++;
edge[ecnt] = Edge(v, u, head[v]); head[v] = ecnt ++;
}
int dfn[maxn], low[maxn], cnt, bridge_num, crash_num;
stack<int> stk;
set<int> bcc;
void tarjan(int u, int pre) {
dfn[u] = low[u] = ++cnt;
for (int i = head[u]; i != -1; i = edge[i].nxt) {
int v = edge[i].v;
if (v == pre) continue;
if (!dfn[v]) {
stk.push(i);
tarjan(v, u);
low[u] = min(low[u], low[v]);
if (low[v] >= dfn[u]) {
int id;
int tmp_cnt = 0;
bcc.clear();
do {
tmp_cnt ++;
id = stk.top();
stk.pop();
bcc.insert(edge[id].u);
bcc.insert(edge[id].v);
} while (edge[id].u != u || edge[id].v != v);
if (tmp_cnt > bcc.size()) crash_num += tmp_cnt;
}
if (low[v] > dfn[u]) bridge_num ++;
}
else if (dfn[v] < dfn[u]) {
stk.push(i);
low[u] = min(low[u], dfn[v]);
}
}
}
int main() {
while (~scanf("%d%d", &n, &m) && n) {
init();
memset(dfn, 0, sizeof(int)*(n+1));
cnt = bridge_num = crash_num = 0;
while (m --) {
int a, b;
scanf("%d%d", &a, &b);
a ++; b ++;
addedge(a, b);
}
for (int i = 1; i <= n; i ++)
if (!dfn[i]) tarjan(i, -1);
printf("%d %d\n", bridge_num, crash_num);
}
return 0;
}

HDU3394 Railway 题解(边双连通分量)的更多相关文章

  1. POJ1144 Network 题解 点双连通分量(求割点数量)

    题目链接:http://poj.org/problem?id=1144 题目大意:给以一个无向图,求割点数量. 这道题目的输入和我们一般见到的不太一样. 它首先输入 \(N\)(\(\lt 100\) ...

  2. HDU3394 点双连通分量

    Railway Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Sub ...

  3. poj3352 Road Construction & poj3177 Redundant Paths (边双连通分量)题解

    题意:有n个点,m条路,问你最少加几条边,让整个图变成边双连通分量. 思路:缩点后变成一颗树,最少加边 = (度为1的点 + 1)/ 2.3177有重边,如果出现重边,用并查集合并两个端点所在的缩点后 ...

  4. HDU 3394 双连通分量 桥 Railway

    第一个答案是统计图中桥的个数 如果一个点-双连通分量中边的个数大于点的个数那么这个块中所有的边都是冲突的,累加到第二个答案中去. #include <iostream> #include ...

  5. POJ 3177 Redundant Paths (桥,边双连通分量,有重边)

    题意:给一个无向图,问需要补多少条边才可以让整个图变成[边双连通图],即任意两个点对之间的一条路径全垮掉,这两个点对仍可以通过其他路径而互通. 思路:POJ 3352的升级版,听说这个图会给重边.先看 ...

  6. POJ 3352 Road Construction(边双连通分量,桥,tarjan)

    题解转自http://blog.csdn.net/lyy289065406/article/details/6762370   文中部分思路或定义模糊,重写的红色部分为修改过的. 大致题意: 某个企业 ...

  7. hdu4612-Warm up(边的双连通分量)

    题意:有n个点,m条边,有重边.现在可以任意在图上添加一条边,求桥的最少数目. 题解:思路就是求出双连通分量之后缩点成为一棵树,然后求出树的直径,连接树的直径就能减少最多的桥. 难点在于:有!重!边! ...

  8. hdoj 4612 Warm up【双连通分量求桥&&缩点建新图求树的直径】

    Warm up Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total Su ...

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

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

随机推荐

  1. oralce 减少访问数据库的次数

    当执行每条SQL语句时, ORACLE在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等等. 由此可见, 减少访问数据库的次数 , 就能实际上减少ORACLE的工作 ...

  2. C++ sort使用两个参数来排序

    排序在编程中经常用到,冒泡法排序时间复杂度高,使用C++库函数sort可以快速排序. 1.必须的头文件#include < algorithm>和using namespace std;  ...

  3. PHP利用纯真IP数据库在本地实现IP地址信息查询

    https://blog.csdn.net/myweishanli/article/details/45098693 准备工作: 建议本地IP地址数据库,请到http://www.cz88.net/这 ...

  4. js中的数据类型及常用属性和方法

    JavaScript 字符串 字符串(或文本字符串)是一串字符(比如 "Bill Gates").字符串被引号包围.您可使用单引号或双引号您可以在字符串内使用引号,只要这些引号与包 ...

  5. mysql-python安装

    操作系统:ubuntu16.04-gnome 首先要安装mysql数据 sudo apt install mysql-server 我们使用pip进行安装第三方模块 系统python版本为2.7.12 ...

  6. 2006年NOIP普及组复赛题解

    题目涉及算法: 明明的随机数:简单模拟: 开心的金明:01背包: Jam的计数法:模拟: 数列:二进制. 明明的随机数 题目链接:https://www.luogu.org/problem/P1059 ...

  7. 你以为SSL是安全的吗?

    在现代的IT安全领域,很大程度上依赖SSL来保障通讯安全.但SSL是安全的吗? 在2005年,王小云证明SHA-1能在较短的时间内找到碰撞.王小云发现SHA-1的安全弱点是偶然还是必然? 就我所知,各 ...

  8. Python--day47--mysql执行计划

    1,什么是mysql执行计划? 让mysql预估执行操作:在要执行的语句前面加explain,就不会真的执行sql语句,只是给出了要执行的数据的情况,如大约有多少条,查询类型.

  9. dynamic web module version

    Ser vlet 3十二月2009开发平台标准版6,6可插性,易于开发,异步ser vlet,安全,文件上传 Ser vlet 2.5九月2005开发平台标准版5,5需要平台标准版5,支持注释 Ser ...

  10. java.lang.IllegalArgumentException: attempt to create saveOrUpdate event with null entity

    今天想把ssh整合的代码跑起来,控制台就一直在报错,搞了半天!!! Hibernate: select computer0_.computerId as computer1_0_, computer0 ...