【LA5135 训练指南】井下矿工 【双连通分量】
题意
有一座地下稀有金属矿由n条隧道和一些连接点组成,其中每条隧道连接两个连接点。任意两个连接点之间最多只有一条隧道。为了降低矿工的危险,你的任务是在一些连接点处安装太平井和相应的逃生装置,使得不管哪个连接点倒塌,不在此连接点的多有矿工都能到达太平井逃生。为节约成本,你应当在尽量少的连接点安装太平井。还需要计算出当太平井的数目最小时的安装方案总数。
分析
1对于一个双连通分量,如果它有两个以上的割顶,则不需要建太平井。如果只有一个割顶,则任选一个非割顶的点建太平井。
2若整个图无割顶,则任涂两个点,方案数为n*(n-1)/2
3对于不属于双连通分量的点,只能在他们每个点都建一个太平井
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <stack>
#include <vector> using namespace std;
const int maxn=+;
int n,sz,N;
int head[maxn],Next[maxn],to[maxn];
struct Edge{
int u,v;
};
void add_edge(int a,int b){
++sz;
to[sz]=b;Next[sz]=head[a];head[a]=sz;
}
int ansn;
long long anss;
int pre[maxn],iscut[maxn],bccno[maxn],dfs_clock,bcc_cnt;
vector<int>bcc[maxn];
stack<Edge>S;
int dfs(int u,int fa){
int lowu=pre[u]=++dfs_clock;
int child=;
for(int i=head[u];i!=-;i=Next[i]){
int v=to[i];
Edge e=(Edge){u,v};
if(!pre[v]){
S.push(e);
child++;
int lowv=dfs(v,u);
lowu=min(lowu,lowv);
if(lowv>=pre[u]){
iscut[u]=;
bcc_cnt++;bcc[bcc_cnt].clear();
for(;;){
Edge x=S.top();S.pop();
if(bccno[x.u]!=bcc_cnt){
bcc[bcc_cnt].push_back(x.u);
bccno[x.u]=bcc_cnt;
}
if(bccno[x.v]!=bcc_cnt){
bcc[bcc_cnt].push_back(x.v);
bccno[x.v]=bcc_cnt;
}
if(x.u==u&&x.v==v)break;
}
}
}
else if(pre[v]<pre[u]&&v!=fa){
S.push(e);
lowu=min(lowu,pre[v]);
}
}
if(fa<&&child==)iscut[u]=;
return lowu;
}
void find_bcc(int n){
memset(pre,,sizeof(pre));
memset(iscut,,sizeof(iscut));
memset(bccno,,sizeof(bccno));
dfs_clock=bcc_cnt=;
for(int i=;i<=n;i++)
if(!pre[i])dfs(i,-);
}
int kase;
int main(){
kase=;
while(scanf("%d",&n)!=EOF&&n){
int a,b;
sz=;
memset(head,-,sizeof(head));
N=;
ansn=;
anss=;
for(int i=;i<=n;i++){
scanf("%d%d",&a,&b);
N=max(N,a);
N=max(N,b);
add_edge(a,b);
add_edge(b,a);
}
find_bcc(N);
for(int i=;i<=bcc_cnt;i++){
int num=;
for(int j=;j<bcc[i].size();j++){
if(iscut[bcc[i][j]])
num++;
}
if(num==){
ansn++;
anss*=(long long)(bcc[i].size()-);
}
if(num==){
ansn+=;
anss*=(long long)bcc[i].size()*(long long)(bcc[i].size()-)/;
}
}
for(int i=;i<=N;i++){
if(!bccno[i])
ansn++;
}
++kase;
printf("Case %d: ",kase);
printf("%d %lld\n",ansn,anss);
}
return ;
}
【LA5135 训练指南】井下矿工 【双连通分量】的更多相关文章
- 【LA3523 训练指南】圆桌骑士 【双连通分量】
题意 有n个骑士经常举行圆桌会议,商讨大事.每次圆桌会议至少应有3个骑士参加,且相互憎恨的骑士不能坐在圆桌旁的相邻位置.如果发生意见分歧,则需要举手表决,因此参加会议的骑士数目必须是奇数,以防赞同和反 ...
- 训练指南 UVA - 11324(双连通分量 + 缩点+ 基础DP)
layout: post title: 训练指南 UVA - 11324(双连通分量 + 缩点+ 基础DP) author: "luowentaoaa" catalog: true ...
- 训练指南 UVALive - 5135 (双连通分量)
layout: post title: 训练指南 UVALive - 5135 (双连通分量) author: "luowentaoaa" catalog: true mathja ...
- 求双连通分量的详解。(根据刘汝佳的训练指南p314)
无向图的双连通分量 点-双连通图:一个连通的无向图内部没有割点,那么该图是点-双连通图. 注意:孤立点,以及两点一边这两种图都是点-双连通的.因为它们都是内部无割点. 边-双连通图:一 ...
- LA 5135 井下矿工(点—双连通分量模板题)
https://vjudge.net/problem/UVALive-5135 题意:在一个无向图上选择尽量少的点涂黑,使得任意删除一个点后,每个连通分量至少有一个黑点. 思路: 首先dfs遍历求出割 ...
- 训练指南 UVALive - 3523 (双联通分量 + 二分图染色)
layout: post title: 训练指南 UVALive - 3523 (双联通分量 + 二分图染色) author: "luowentaoaa" catalog: tru ...
- POJ 2942Knights of the Round Table(二分图判定+双连通分量)
题目链接 题意:一些骑士,他们有些人之间有矛盾,现在要求选出一些骑士围成一圈,圈要满足如下条件:1.人数大于1.2.总人数为奇数.3.有仇恨的骑士不能挨着坐.问有几个骑士不能和任何人形成任何的圆圈. ...
- 训练指南 UVALive - 4287 (强连通分量+缩点)
layout: post title: 训练指南 UVALive - 4287 (强连通分量+缩点) author: "luowentaoaa" catalog: true mat ...
- POJ2942 Knights of the Round Table[点双连通分量|二分图染色|补图]
Knights of the Round Table Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 12439 Acce ...
随机推荐
- luvit 被忽视的lua 高性能框架(仿nodejs)
备注: luvit 开放模式和nodejs 一样,但是因为生态以及小众语言的问题,使用的人比较少,但是从目前 来看更新速度还是比较快的,但是从现有lua 开发框架来说一般倾向于使 ...
- kubectl&docker容器命令行窗口太小
#k8s kubectl exec -ti busybox env COLUMNS=$COLUMNS LINES=$LINES bash #k8s example kubectl exec -t ...
- Loadrunner录制脚本之浏览器
Loadrunner录制脚本之浏览器 用Loadrunner录制脚本,尤其现在的IE浏览器版本升级较快,脚本的录制有时候还是需要集RP.Luck的,当然,Loadrunner对于IE的支持算最好的了, ...
- VMware下安装的Mac OS X如何修改显示分辨率 (转)
我在Win7下利用VMware安装了苹果的OS x 10.8系统,安装成功启动后,发现分辨率为1024*768,而宿机的分辨率是1440*900,我想让虚拟机全屏显示,也就是想在雪豹下屏幕的分辨率也能 ...
- JAVA-Unit03: SQL(基础查询) 、 SQL(关联查询)
Unit03: SQL(基础查询) . SQL(关联查询) 列别名 当SELECT子句中查询的列是一个函数 或者表达式时,那么查询出来的结果集 中对应的该字段的名字就是这个函数或者 表达式的名字.为此 ...
- AT 指令和常见错误码
一. 一般命令 1. AT+CGMI 给出模块厂商的标识. 2. AT+CGMM 获得模块标识.这个命令用来得到支持的频带(GSM 900,DCS 1800 或PCS 1900).当模块有多频带时,回 ...
- 在debian上安装最新版erlang
参考这里https://www.erlang-solutions.com/downloads/download-erlang-otp 源码安装的无视 sudo gvim /etc/apt/source ...
- 关于FPGA供电
FPGA是一种多电源需求的芯片,主要有3种电源需求: VCCINT:核心工作电压,PCI Express (PCIe) 硬核IP 模块和收发器物理编码子层(PCS) 电源.一般电压都很低,目前常用的F ...
- Netty--使用TCP协议传输文件
简介: 用于将文件通过TCP协议传输到另一台机器,两台机器需要通过网络互联. 实现: 使用Netty进行文件传输,服务端读取文件并将文件拆分为多个数据块发送,接收端接收数据块,并按顺序将数据写入文件. ...
- windows 安装redis
git :https://github.com/ServiceStack/redis-windows 备份地址:https://gitee.com/liuq1991v/redis-for-window ...