HDU3394 Railway 题解(边双连通分量)
题目链接: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 题解(边双连通分量)的更多相关文章
- POJ1144 Network 题解 点双连通分量(求割点数量)
题目链接:http://poj.org/problem?id=1144 题目大意:给以一个无向图,求割点数量. 这道题目的输入和我们一般见到的不太一样. 它首先输入 \(N\)(\(\lt 100\) ...
- HDU3394 点双连通分量
Railway Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Sub ...
- poj3352 Road Construction & poj3177 Redundant Paths (边双连通分量)题解
题意:有n个点,m条路,问你最少加几条边,让整个图变成边双连通分量. 思路:缩点后变成一颗树,最少加边 = (度为1的点 + 1)/ 2.3177有重边,如果出现重边,用并查集合并两个端点所在的缩点后 ...
- HDU 3394 双连通分量 桥 Railway
第一个答案是统计图中桥的个数 如果一个点-双连通分量中边的个数大于点的个数那么这个块中所有的边都是冲突的,累加到第二个答案中去. #include <iostream> #include ...
- POJ 3177 Redundant Paths (桥,边双连通分量,有重边)
题意:给一个无向图,问需要补多少条边才可以让整个图变成[边双连通图],即任意两个点对之间的一条路径全垮掉,这两个点对仍可以通过其他路径而互通. 思路:POJ 3352的升级版,听说这个图会给重边.先看 ...
- POJ 3352 Road Construction(边双连通分量,桥,tarjan)
题解转自http://blog.csdn.net/lyy289065406/article/details/6762370 文中部分思路或定义模糊,重写的红色部分为修改过的. 大致题意: 某个企业 ...
- hdu4612-Warm up(边的双连通分量)
题意:有n个点,m条边,有重边.现在可以任意在图上添加一条边,求桥的最少数目. 题解:思路就是求出双连通分量之后缩点成为一棵树,然后求出树的直径,连接树的直径就能减少最多的桥. 难点在于:有!重!边! ...
- hdoj 4612 Warm up【双连通分量求桥&&缩点建新图求树的直径】
Warm up Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others)Total Su ...
- zoj 2588 Burning Bridges【双连通分量求桥输出桥的编号】
Burning Bridges Time Limit: 5 Seconds Memory Limit: 32768 KB Ferry Kingdom is a nice little cou ...
随机推荐
- HTML打印print
上代码: //打印 function printme() { global_Html = document.body.innerHTML; //document.body.innerHTML = do ...
- JQuery完整验证&密码的显示与隐藏&验证码
HTML <link href="bootstrap.css" rel="stylesheet"> <link href="gloa ...
- 基于Mysql实现分布式锁
一.分布式锁要解决的问题 可以保证在分布式部署的应用集群中,同一个方法在同一时间只能被一台机器上的一个线程执行. 这把锁要是一把可重入锁(避免死锁) 这把锁最好是一把阻塞锁(根据业务需求考虑要不要这条 ...
- Python type hints 之 Optional,Union
1,前言 type hint 在pep484加入,我个人觉得这种类似于类型约束的(机制)有点违背了python简单.简洁的初衷,在慢慢向c# java 这种强类型语言看齐的节奏. 不过好在不强制使用, ...
- Pytorch使用GPU
pytorch如何使用GPU在本文中,我将介绍简单如何使用GPU pytorch是一个非常优秀的深度学习的框架,具有速度快,代码简洁,可读性强的优点. 我们使用pytorch做一个简单的回归. 首先准 ...
- git 删除时报 the branch is not fully merged 这是什么意思
今天删除本地分支 git branch -d XX 提示: the branch XXX is not fully merged原因:XXX分支有没有合并到当前分支的内容 解决方法:使用大写的D 强制 ...
- PHP redis安装扩展
命令: 查看php版本:PHP -v 查看php安装的扩展:PHP -m php扩展开发包(包括phpize,php -config):yum install php-devel which phpi ...
- Python--day47--mysql执行计划
1,什么是mysql执行计划? 让mysql预估执行操作:在要执行的语句前面加explain,就不会真的执行sql语句,只是给出了要执行的数据的情况,如大约有多少条,查询类型.
- win10系统激活 快捷方式
系统不定期就会提示激活,每次激活都是找各种工具折腾,今天捣鼓简单的脚本直接激活~~ 首先查看自己系统的版本,后面才能找到合适的激活码 win+R 启动程序 输入 winver 即可查看系统版本 2.查 ...
- codeforce 382 div2 E —— 树状dp
题意:给一棵n个结点的无根树染色,求使每个结点距离为k的范围内至少有一个被染色的结点的总染色方法数目 分析:首先我们定义: 对于结点v, 如果存在一个黑色结点u距离v不超过k,则结点v被“控制” 首先 ...