UVALive 5135 Mining Your Own Business 双连通分量
据说这是一道Word Final的题,Orz。。。
原题链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3136
题意:
给你一个联通图,让你选择一些点,使得这个图的任意一个点消失后,其余的点都能到达某个你选择的点。问你最少选择哪些点,并且输出在最优的情况下,有多少方案。
题解:
一眼看过去,做法很简单,就删掉所有的割点后,考察联通块的个数就好。但这道题满满的坑。。要不怎么是总决赛的题。。
首先如果这个图只有一个联通块,那么答案就应该是任选两个点,这是因为,如果其中一个点挂了,还能走另外一个点。
如果一个联通块有大于一个割点,那么这个联通块就不需要,这是因为两个割点不可能同时挂了。
代码:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<set>
#define MAX_V 50004
using namespace std; int V=;
vector<int> G[MAX_V];
int N; int dfn[MAX_V],low[MAX_V],ind=;
bool vis[MAX_V];
bool isCut[MAX_V];
int tot=; long long ways=;
long long tmp=;
long long cnt=; bool used[MAX_V];
set<int> se; void init(){
se.clear();
V=ind=cnt=tmp=;
ways=;
memset(used,,sizeof(used));
memset(dfn,,sizeof(dfn));
memset(low,,sizeof(low));
memset(vis,,sizeof(vis));
memset(isCut,,sizeof(isCut));
for(int i=;i<=N+;i++)G[i].clear();
} void Tarjan(int u,int p) {
dfn[u] = low[u] = ++ind;
vis[u]=;
int child = ;
for (int i = ; i < G[u].size(); i++) {
int v = G[u][i];
if (v == p)continue;
if (!vis[v]) {
child++;
Tarjan(v, u);
low[u] = min(low[v], low[u]);
if (p == && child > )isCut[u] = ;
if (p&&low[v] >= dfn[u])
isCut[u] = ;
tot+=isCut[u];
}
else
low[u] = min(dfn[v], low[u]);
}
} void dfs(int u) {
if (used[u] || isCut[u])return;
tmp++;
used[u] = ;
for (int i = ; i < G[u].size(); i++){
int v=G[u][i];
if(isCut[v]){
se.insert(v);
continue;
}
dfs(v);
}
} int main() {
int cas = ;
cin.sync_with_stdio(false);
while (cin >> N) {
tot=;
if (N == )break;
init();
for (int i = ; i < N; i++) {
int u, v;
cin >> u >> v;
V = max(V, max(u, v));
G[u].push_back(v);
G[v].push_back(u);
}
Tarjan(, );
cout << "Case " << ++cas << ": ";
if (tot == ) {
cout << << " " << (long long)V * (V - ) / << endl;
continue;
}
for (int u = ; u <= V; u++) {
if (isCut[u])continue;
tmp = ;
if (!used[u]) {
se.clear();
dfs(u);
if (se.size() == && tmp) {
ways *= tmp;
cnt++;
}
}
}
cout << cnt << " " << ways << endl;
}
return ;
}
UVALive 5135 Mining Your Own Business 双连通分量的更多相关文章
- UVALive 5135 Mining Your Own Business 双连通分量 2011final
题意:n条隧道由一些点连接而成,其中每条隧道链接两个连接点.任意两个连接点之间最多只有一条隧道.任务就是在这些连接点中,安装尽量少的太平井和逃生装置,使得不管哪个连接点倒塌,工人都能从其他太平井逃脱, ...
- UVALive - 5135 - Mining Your Own Business(双连通分量+思维)
Problem UVALive - 5135 - Mining Your Own Business Time Limit: 5000 mSec Problem Description John D ...
- UVALive - 5135 Mining Your Own Business
刘汝佳白书上面的一道题目:题意是给定一个联通分量,求出割顶以及双连通分量的个数,并且要求出安放安全井的种类数,也就是每个双连通分量中结点数(除开 割顶)个数相乘,对于有2个及以上割顶的双连通分量可以不 ...
- LA 5135 井下矿工(点—双连通分量模板题)
https://vjudge.net/problem/UVALive-5135 题意:在一个无向图上选择尽量少的点涂黑,使得任意删除一个点后,每个连通分量至少有一个黑点. 思路: 首先dfs遍历求出割 ...
- 【LA】5135 Mining Your Own Business
[算法]点双连通分量 [题解]详见<算法竞赛入门竞赛入门经典训练指南>P318-319 细节在代码中用important标注. #include<cstdio> #includ ...
- UVALive 5135 Mining Your Own Bussiness【tarjan点双】
LINK1 LINK2 题目大意 给你一个无向连通图,让你给一些点染上黑色,需要满足染色之后,断开任意一个节点,要满足任意一个联通块中剩下的节点中至少有一个黑点 思路 一开始想的是把每一个点双联通分量 ...
- LA 5135 Mining Your Own Business
求出 bcc 后再……根据大白书上的思路即可. 然后我用的是自定义的 stack 类模板: #include<cstdio> #include<cstring> #includ ...
- 训练指南 UVALive - 5135 (双连通分量)
layout: post title: 训练指南 UVALive - 5135 (双连通分量) author: "luowentaoaa" catalog: true mathja ...
- hdu3844 Mining Your Own Business,无向双连接组件
点击打开链接 无向图的双连通分量 #include<cstdio> #include<stack> #include<vector> #include<map ...
随机推荐
- try_except__异常处理
try...except.raise 一.try...except 有时候我们写程序的时候,会出现一些错误或异常,导致程序终止.例如,做除法时,除数为0,会引起一个ZeroDivisionError ...
- day05 模块以及内置常用模块用法
内置常用模块详解: 1 time 2 datetime 3 random 4 os 5 sys 6 shutil 7 shelve 8 xml 9 configparser 10 hashlib ...
- selenium非常好的资料收集
非常全的中文资料:http://qi-ling2006.iteye.com/ http://blog.csdn.net/qq744746842/article/details/49926917
- Leetcode 473.火柴拼正方形
火柴拼正方形 还记得童话<卖火柴的小女孩>吗?现在,你知道小女孩有多少根火柴,请找出一种能使用所有火柴拼成一个正方形的方法.不能折断火柴,可以把火柴连接起来,并且每根火柴都要用到. 输入为 ...
- Django模板(filter过滤器{{ }}与tag标签{% %}应用)
模板里面过滤器与标签的应用 templates模板里面的应用参考(主要应用在这里面) <!DOCTYPE html> <html lang="en"> & ...
- Farey sequences
n阶的法里数列是0和1之间最简分数的数列,由小至大排列,每个分数的分母不大于n. Stern-Brocot树(SB Tree)可以生成这个序列 {0/1,1/1} {0/1,1/2,1/1} {0/1 ...
- 2017"百度之星"程序设计大赛 - 初赛(A)
小C的倍数问题 Accepts: 1990 Submissions: 4931 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 327 ...
- rails提供的validators
Instance Public methods attribute_method?(attribute)Link Returns true if attribute is an attribute m ...
- you build it,you run it
this article is almostly about a book named Migrating_to_Microservices_Databases, and it's just the ...
- 九度oj 题目1470:调整方阵
题目描述: 输入一个N(N<=10)阶方阵,按照如下方式调整方阵:1.将第一列中最大数所在的行与第一行对调.2.将第二列中从第二行到第N行最大数所在的行与第二行对调. 依此类推...N-1.将第 ...