UVALive 5135 Mining Your Own Business 双连通分量

时间:2023-02-06 18:35:21

据说这是一道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 双连通分量的更多相关文章

  1. UVALive 5135 Mining Your Own Business 双连通分量 2011final

    题意:n条隧道由一些点连接而成,其中每条隧道链接两个连接点.任意两个连接点之间最多只有一条隧道.任务就是在这些连接点中,安装尽量少的太平井和逃生装置,使得不管哪个连接点倒塌,工人都能从其他太平井逃脱, ...

  2. UVALive - 5135 - Mining Your Own Business(双连通分量&plus;思维)

    Problem   UVALive - 5135 - Mining Your Own Business Time Limit: 5000 mSec Problem Description John D ...

  3. UVALive - 5135 Mining Your Own Business

    刘汝佳白书上面的一道题目:题意是给定一个联通分量,求出割顶以及双连通分量的个数,并且要求出安放安全井的种类数,也就是每个双连通分量中结点数(除开 割顶)个数相乘,对于有2个及以上割顶的双连通分量可以不 ...

  4. LA 5135 井下矿工(点—双连通分量模板题)

    https://vjudge.net/problem/UVALive-5135 题意:在一个无向图上选择尽量少的点涂黑,使得任意删除一个点后,每个连通分量至少有一个黑点. 思路: 首先dfs遍历求出割 ...

  5. 【LA】5135 Mining Your Own Business

    [算法]点双连通分量 [题解]详见<算法竞赛入门竞赛入门经典训练指南>P318-319 细节在代码中用important标注. #include<cstdio> #includ ...

  6. UVALive 5135 Mining Your Own Bussiness【tarjan点双】

    LINK1 LINK2 题目大意 给你一个无向连通图,让你给一些点染上黑色,需要满足染色之后,断开任意一个节点,要满足任意一个联通块中剩下的节点中至少有一个黑点 思路 一开始想的是把每一个点双联通分量 ...

  7. LA 5135 Mining Your Own Business

    求出 bcc 后再……根据大白书上的思路即可. 然后我用的是自定义的 stack 类模板: #include<cstdio> #include<cstring> #includ ...

  8. 训练指南 UVALive - 5135 (双连通分量)

    layout: post title: 训练指南 UVALive - 5135 (双连通分量) author: "luowentaoaa" catalog: true mathja ...

  9. hdu3844 Mining Your Own Business,无向双连接组件

    点击打开链接 无向图的双连通分量 #include<cstdio> #include<stack> #include<vector> #include<map ...

随机推荐

  1. GTC China 2016观感

    上周二在北京参加了GTC China 2016,最大的感受就是一个字,“冷”!黄教主一如既往坚持机车皮夹克装,9月中旬的北京还没有那么的冷啊,感觉全场的空调简直是为他而开...好的,以上吐槽完毕,接着 ...

  2. windows系统下在dos命令行kill掉被占用的pid &lpar;转&rpar;

    原文出自:http://www.2cto.com/os/201304/203771.html   windows系统下在dos命令行kill掉被占用的pid   1.开始-->运行-->c ...

  3. 测试api代码,简单的接口测试代码

    http://www.oschina.net/code/snippet_1408874_43829 <html lang="zh-CN"> <head>   ...

  4. java 同步锁方法

    方法一:动态同步锁 class Demo_thread implements Runnable{ public static int sum = 0; public synchronized void ...

  5. TagHighlight

    :UpdateTypesFile 命令会生成相应的上色高亮文件(生成的着色文件可以叫types_c.taghl)还有相应的tags文件,寻找tags或taghl_config.txt确定project ...

  6. PYTHON连MS SQL示例

    先要设置WINDOWS的系统DSN的.然后才可以哟. import pyodbc conxn = pyodbc.connect('DSN=BBB; DATABASE=Northwind;UID=AAA ...

  7. 启动Activity,传递参数最佳实践

    优化后的好处不言而喻,OtherActivity中所需要的参数都在方法参数中体现,减少了交流询问的成本. (1)MainActivity.java OtherActivity.openActivity ...

  8. Vue 非父子组件通信

    组件是Vue核心的一块内容,组件之间的通信也是很基本的开发需求.组件通信又包括父组件向子组件传数据,子组件向父组件传数据,非父子组件间的通信.前两种通信Vue的文档都说的很清楚,但是第三种文档上确只有 ...

  9. Docker安装入门 -- 中间件镜像

    Docker安装入门 -- 中间件镜像 php-fpm 1.docker build -t csphere/php-fpm:5.4 .   //在当前目录下创建镜像 2.docker run -d - ...

  10. MySQL数据库基础(三)(操作数据表中的记录)

    1.插入记录INSERT 命令:,expr:表达式 注意:如果给主键(自动编号的字段)赋值的话,可以赋值'NULL'或'DEFAULT',主键的值仍会遵守默认的规则:如果省略列名的话,所有的字段必须一 ...