据说这是一道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(双连通分量+思维)

    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. leetcode-16-greedyAlgorithm

    455. Assign Cookies 解题思路: 先将两个数组按升序排序,然后从后往前遍历,当s[j] >= g[i]的时候,就把s[j]分给g[i],i,j都向前移动,count+1;否则向 ...

  2. bash循环for/while/until

    shell流程控制之一:for循环     for VAR in LIST; do         STATEMENT1         ...     done         例:         ...

  3. 关于freetype在安装中的遇到的问题

    本人电脑配置的是Anconda环境+pycharm2017.2.2 comuniity,每次安装什么包就是直接pip install 的,但是这次在安装freetype的安装中却遇到了麻烦. 具体是在 ...

  4. fzu1759 Super A^B mod C 扩展欧拉定理降幂

    扩展欧拉定理: \[ a^x \equiv a^{x\mathrm{\ mod\ }\varphi(p) + x \geq \varphi(p) ? \varphi(p) : 0}(\mathrm{\ ...

  5. 小白用shiro(1)

    本文来自网易云社区 作者:王飞 首先引入一段关于shiro的介绍: 开发系统中,少不了权限,目前java里的权限框架有SpringSecurity和Shiro(以前叫做jsecurity),对于Spr ...

  6. doc下设置永久环境变量的好方法

    http://www-2w.blog.163.com/blog/static/97931518201021211123267/ 需要查看命令具体实现:setx machine “%path%”. 配置 ...

  7. centos7下nginx添加到自定义系统服务中提示Access denied

    安装好nginx后,添加到系统服务中 在/usr/lib/systemd/system下创建nginx.service文件内容如下: [Unit] Description=nginx - high p ...

  8. iOS AFNetWorking中block执行完后再执行其它操作

    需求:同时进行两次网络请求,网络请求是异步的,在网络请求成功后进行其它的操作.两个网络请求是这样,一个网络请求中block执行完之后,再进行其它操作,也是一样的原理,只是这时候不需要线程组了,只需要信 ...

  9. [LOJ#113]最大异或和

    [LOJ#113]最大异或和 试题描述 这是一道模板题. 给由 n 个数组成的一个可重集 S,求一个集合 T⊆S,使 T1 xor T2 xor … xor T|T| 最大 输入 第一行一个数 n.第 ...

  10. Redis 复制功能的几个重要方面

    Redis 复制功能的几个重要方面:1. 一个Master可以有多个Slave:2. Redis使用异步复制.从2.8开始,Slave会周期性(每秒一次)发起一个Ack确认复制流(replicatio ...