BZOJ_2730_ [HNOI2012]矿场搭建_点双联通分量
BZOJ_2730_ [HNOI2012]矿场搭建_点双联通分量
Description
Input
输入文件有若干组数据,每组数据的第一行是一个正整数 N(N≤500),表示工地的隧道数,接下来的 N 行每行是用空格隔开的两个整数 S 和 T,表示挖 S 与挖煤点 T 由隧道直接连接。输入数据以 0 结尾。
Output
输入文件中有多少组数据,输出文件 output.txt 中就有多少行。每行对应一组输入数据的 结果。其中第 i 行以 Case i: 开始(注意大小写,Case 与 i 之间有空格,i 与:之间无空格,: 之后有空格),其后是用空格隔开的两个正整数,第一个正整数表示对于第 i 组输入数据至少需 要设置几个救援出口,第二个正整数表示对于第 i 组输入数据不同最少救援出口的设置方案总 数。输入数据保证答案小于 2^64。输出格式参照以下输入输出样例。
Sample Input
1 3
4 1
3 5
1 2
2 6
1 5
6 3
1 6
3 2
6
1 2
1 3
2 4
2 5
3 6
3 7
0
Sample Output
Case 2: 4 1
HINT
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
#define N 100050
typedef long long ll;
vector<int>V[N];
int head[N],to[N<<1],nxt[N<<1],cnt=1;
int vis[N<<1],S[N<<1],top,bl[N<<1],bcc,dfn[N],low[N],rt,tot,iscut[N],fa[N],n,m;
inline void add(int u,int v) {
to[++cnt]=v; nxt[cnt]=head[u]; head[u]=cnt;
}
void dfs(int x) {
int i,num=0;
dfn[x]=low[x]=++tot;
for(i=head[x];i;i=nxt[i]) {
if(vis[i]) continue;
vis[i]=vis[i^1]=1;
num++;
S[++top]=i;
if(!dfn[to[i]]) {
dfs(to[i]);
low[x]=min(low[x],low[to[i]]);
if(dfn[x]<=low[to[i]]) {
iscut[x]=1;
int t;
++bcc; V[bcc].clear();
do {
t=S[top--];
int u=to[t^1],v=to[t];
if(fa[u]!=bcc) fa[u]=bcc,V[bcc].push_back(u);
if(fa[v]!=bcc) fa[v]=bcc,V[bcc].push_back(v);
}while(t!=i);
}
}else {
low[x]=min(low[x],dfn[to[i]]);
}
}
if(rt==x&&num<2) iscut[x]=0;
}
int Cas;
void solve() {
n=0;
Cas++;
memset(head,0,sizeof(head)); cnt=1;
memset(iscut,0,sizeof(iscut));
memset(dfn,0,sizeof(dfn));
memset(fa,0,sizeof(fa));
memset(vis,0,sizeof(vis));
top=0; bcc=0;
int i,x,y,j;
for(i=1;i<=m;i++) scanf("%d%d",&x,&y),add(x,y),add(y,x),n=max(n,max(x,y));
for(i=1;i<=n;i++) {
if(!dfn[i]) {
dfs(rt=i);
}
}
int ans1=0; ll ans2=1;
// for(i=1;i<=n;i++) printf("%d\n",iscut[i]);
// printf("%d\n",bcc);
for(i=1;i<=bcc;i++) {
int lim=V[i].size(),num=0;
for(j=0;j<lim;j++) {
// printf("%d\n",V[i][j]);
if(iscut[V[i][j]]) num++;
}
// puts("FUCK");
if(num==1) ans1++,ans2=ans2*(lim-1);
}
if(bcc==1) ans1=2,ans2=1ll*(V[1].size()-1)*(V[1].size())/2;
printf("Case %d: %d %lld\n",Cas,ans1,ans2);
}
int main() {
while(scanf("%d",&m)!=EOF&&m) solve();
}
BZOJ_2730_ [HNOI2012]矿场搭建_点双联通分量的更多相关文章
- P3225 [HNOI2012]矿场搭建 割点 tarjan 双联通分量
https://www.luogu.org/problemnew/show/P3225 题意 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条 ...
- [HNOI2012]矿场搭建 BZOJ2730 点双+结论
Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一 ...
- 【BZOJ】2730: [HNOI2012]矿场搭建【Tarjan找割点】【分联通块割点个数】
2730: [HNOI2012]矿场搭建 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3230 Solved: 1540[Submit][Stat ...
- Tarjan 点双+割点+DFS【洛谷P3225】 [HNOI2012]矿场搭建
P3225 [HNOI2012]矿场搭建 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤 ...
- [HNOI2012]矿场搭建 (点双连通)
题目 [HNOI2012]矿场搭建 解析 这个题做的我十分自闭.. 没看出这个是个点双,然后一晚上+半上午.. 一看肯定和割点有关,我们找到所有的点双,会发现有这么几种情况 连通块中一个割点也没有,这 ...
- [BZOJ2730][HNOI2012]矿场搭建 点双 割点
2730: [HNOI2012]矿场搭建 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2852 Solved: 1344[Submit][Stat ...
- bzoj 2730: [HNOI2012]矿场搭建——tarjan求点双
Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一 ...
- BZOJ2730 矿场搭建 解题报告 点双联通分量
题意概述: 一张有向图,在其中设置一些关键点(即题目中的逃生出口),使得删除任意一个点之后其余点都可以到达至少一个关键点. 问至少需要设置多少中关键点,有多少种设置方法. 解析: 首先,这道题要求删掉 ...
- 洛谷 P3225 [HNOI2012]矿场搭建 解题报告
P3225 [HNOI2012]矿场搭建 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤 ...
随机推荐
- 自定义PropertyGrid控件【转】
自定义PropertyGrid控件 这篇随笔其实是从别人博客上载录的.感觉很有价值,整理了一下放在了我自己的博客上,希望原作者不要介意. 可自定义PropertyGrid控件的属性.也可将属性名称显示 ...
- Net调用非托管代码(P/Invoke与C++InterOP) [转]
将 System::String 转换为 wchar_t* 或 char* PtrToStringChars将String转换为本机wchar_t *或char *.由于 CLR 字符串为内部 Uni ...
- POJ2386 Lake Counting 【DFS】
Lake Counting Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 20782 Accepted: 10473 D ...
- javacript中apply和call的区别
apply:方法能劫持另外一个对象的方法,继承另外一个对象的属性. 接受的参数是一个字符串. call:和apply的意思一样,只不过是参数列表不一样. 接收的参数是一个数组. 例如: <s ...
- python正则中的贪婪与非贪婪
当重复一个正则表达式时,如用 a*,操作结果是尽可能多地匹配模式.当你试着匹配一对对称的定界符,如 HTML 标志中的尖括号.匹配单个 HTML 标志的模式不能正常工作,因为 .* 的本质是“贪婪”的 ...
- 【TensorFlow-windows】(四) CNN(卷积神经网络)进行手写数字识别(mnist)
主要内容: 1.基于CNN的mnist手写数字识别(详细代码注释) 2.该实现中的函数总结 平台: 1.windows 10 64位 2.Anaconda3-4.2.0-Windows-x86_64. ...
- js thiskeyword
相信大家都接触过this了,那么 this究竟是什么意思呢?看其字面意思就是个代词.指代其它的一些东西. 那么我们在程序其中,事实上也是一样.this也是个代词. 比方我们在java其中,this的k ...
- 更改UISearchBar button属性
//点击搜索框时触发 - (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar { self.theSearchUserSearchBa ...
- mysql 5.6 bug
https://dev.mysql.com/doc/refman/5.6/en/account-management-sql.html USE mysql; SELECT Host,User FROM ...
- db的操作
'/---------------------------------------------------------------------------------------------- '/ ...