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]矿场搭建 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤 ...
随机推荐
- 转:MapReduce原理与设计思想
转自:http://www.cnblogs.com/wuyudong/p/mapreduce-principle.html 简单解释 MapReduce 算法 一个有趣的例子 你想数出一摞牌中有多少张 ...
- windows下taskkill命令简介
1.简介 使用该工具可以按照进程 ID (PID) 或映像名称终止任务. 2.语法 TASKKILL [/S system [/U username [/P [password]]]] ...
- VM(转)
vmplayer && VMworkstation 很多人想尝试一下多种不同的操作系统,例如学习Linux:又或者希望搞一个专门的系统用来测试各种各样东西而不会搞乱搞坏现有的系统. ...
- IDA断点和搜索
一.断点 调试很重要一点是下断点,看看IDA提供的功能,本来已经和WinDbg一样强了. 官方文档的变化 Edit breakpoint Action name: BreakpointEdit Con ...
- 下载与安装---tensorflow on linux
http://wiki.jikexueyuan.com/project/tensorflow-zh/get_started/os_setup.html 你可以使用我们提供的 Pip, Docker, ...
- oracle sql修改序列为当前序列开始
declare v_num integer; last_value integer;Begin select SEQ_TBM_ID.NEXTVAL into last_value from d ...
- datatable的使用
学习可参考:http://www.guoxk.com/node/jquery-datatables http://yuemeiqing2008-163-com.iteye.com/blog/20069 ...
- 怎样退出App之前唤醒还有一个App?
郝萌主倾心贡献,尊重作者的劳动成果,请勿转载. 假设文章对您有所帮助,欢迎给作者捐赠,支持郝萌主,捐赠数额任意,重在心意^_^ 我要捐赠: 点击捐赠 Cocos2d-X源代码下载:点我传送 SDK并没 ...
- 官网下载kettle
首先什么是kettle,引用下百度百科 Kettle是一款国外开源的ETL工具,纯java编写,可以在Window.Linux.Unix上运行,数据抽取高效稳定. Kettle 中文名称叫水壶,该项目 ...
- 【转】IDA Pro7.0使用技巧总结
俗话说,工欲善其事,必先利其器,在二进制安全的学习中,使用工具尤为重要,而IDA又是玩二进制的神器,以前在使用IDA的时候,只是用几个比较常用的功能,对于IDA的其他功能没有去研究,于是本着学习的精神 ...