BZOJ2730 HNOI2012 矿井搭建 连通性
题意:给定一无向图,选择最少的点,使得删除任意一个点后,其他的点都与所选择的点中任意一个联通
题解:
由于割点上肯定不能放井,所以开始时删除所有的割点。然后找出所有的双连通分量,如果双连通分量上有两个及以上割点,不用放井;如果只有一个割点,一定要放一个井,然后乘法原理统计答案即可。
至于怎么求双连通分量,由于一个割点一定是在两个双连通分量交界的地方,因此DFS每个未访问节点,仅当一个点不为割点时扩展该节点。
#include <map> #include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> using namespace std; #define ll long longconst int MAXN=500+2; struct HASH{int u;HASH *next;HASH(){}HASH(int _u,HASH *_next):u(_u),next(_next){} }*table[MAXN],mem[2*MAXN]; int N,M,T,f,cnt,ans,t[MAXN],bcc[MAXN]; int dfn[MAXN],low[MAXN],depth; ll s[MAXN],ans_sum; bool flag[MAXN],cut[MAXN]; map<int,int> m;void Insert(int u,int v){table[u]=&(mem[cnt++]=HASH(v,table[u]));table[v]=&(mem[cnt++]=HASH(u,table[v])); }void Tarjan(int f,int x){dfn[x]=low[x]=++depth;int c=0;for(HASH *p=table[x];p;p=p->next)if(!dfn[p->u]){Tarjan(x,p->u),low[x]=min(low[x],low[p->u]),c++;if(low[p->u]>=dfn[x]) cut[x]=1;}else if(p->u!=f && dfn[p->u]<dfn[x]) low[x]=min(low[x],dfn[p->u]);if(!f && c==1) cut[x]=0; }void DFS(int x){flag[x]=1,s[cnt]++;for(HASH *p=table[x];p;p=p->next){if(flag[p->u]) continue;if(!cut[p->u]) DFS(p->u);else if(bcc[p->u]!=cnt) bcc[p->u]=cnt,t[cnt]++;} }int main(){while(scanf("%d",&M)!=EOF && M){N=cnt=ans=depth=0,ans_sum=1,T++;m.clear();memset(t,0,sizeof(t));memset(s,0,sizeof(s));memset(low,0,sizeof(low));memset(dfn,0,sizeof(dfn));memset(cut,0,sizeof(cut));memset(bcc,0,sizeof(bcc));memset(flag,0,sizeof(flag));memset(table,0,sizeof(table));for(int i=1,u,v;i<=M;i++){scanf("%d %d",&u,&v);if(!m[u]) m[u]=++N;if(!m[v]) m[v]=++N;Insert(m[u],m[v]);}for(int i=1;i<=N;i++)if(!dfn[i]) Tarjan(0,i);cnt=0;for(int i=1;i<=N;i++)if(!cut[i] && !flag[i]) ++cnt,DFS(i);if(cnt==1) printf("Case %d: 2 %lld\n",T,N*(N-1)/2);else{for(int i=1;i<=cnt;i++)if(t[i]==1) ans++,ans_sum*=s[i];printf("Case %d: %d %lld\n",T,ans,ans_sum);}}return 0; }
View Code
转载于:https://www.cnblogs.com/WDZRMPCBIT/p/6477071.html
BZOJ2730 HNOI2012 矿井搭建 连通性相关推荐
- [BZOJ2730][HNOI2012]矿场搭建(求割点)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2730 分析: 如果坍塌的点不是割点,那没什么影响,主要考虑坍塌的点是割点的情况. 显然 ...
- [BZOJ2730]:[HNOI2012]矿场搭建(塔尖)
题目传送门 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一个 ...
- 洛谷——P3225 [HNOI2012]矿场搭建
P3225 [HNOI2012]矿场搭建 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤 ...
- 点双连通分量 [HNOI2012]矿场搭建
问题 F: [HNOI2012]矿场搭建 时间限制: 1 Sec 内存限制: 128 MB 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人 ...
- 【bzoj2730】 HNOI2012—矿场搭建
http://www.lydsy.com/JudgeOnline/problem.php?id=2730 (题目链接) 题意 给出一张图,问如果删掉其中一个点,使得其他每个节点都有一个安全撤离的出口, ...
- 【BZOJ2730 || HNOI2012】矿场搭建
其实现在做得挺心酸的,4月份参加省选的时候什么都不会 特别是对关于联通分量什么题目的表示不明觉厉 现在意识到其实这和学OI的时间没有什么关系 完全是自己没有用心.没有花时间罢了,然后得花现在的时间去弥 ...
- bzoj 2730: [HNOI2012]矿场搭建——tarjan求点双
Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一 ...
- P3225 [HNOI2012]矿场搭建
思路:$tarjan+组合$ 提交:1次 题解: 先$tarjan$求出割点,然后按连通块的性质分类讨论: 1.若没有与割点相连,则需要两个井,防止一个坏掉. 2.若有一个割点相连,修一个井,考虑井坏 ...
- Tarjan水题系列(2):HNOI2012 矿场搭建
题目: 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一个挖煤点坍塌之后 ...
最新文章
- python解析json_【python学习】json解析
- R 语言画图中英文字体解决方案
- mysql 导入一个数据库_mysql导入一个数据库
- C/C++循环输入问题
- linux系统读取第二个盘的数据,磁盘及文件系统管理—第二篇
- python3 列表的增删改查
- 【转】NHIBERNATE的各种保存方式的区别 (SAVE,PERSIST,UPDATE,SAVEORUPDTE,MERGE,FLUSH,LOCK)
- LoadRunner 参数模拟——快速得到并发用户的进场规则
- y电容如何选型_干式试验变压器选型依据
- oracle报无效月份 注册表,在oracle中插入时间时出现“无效的月份”解决方法
- [ES6] 细化ES6之 -- 迭代器与生成器
- android studio jni so,Android studio JNI 制做SO文件,在其余项目中调用
- 7005.element-ui组件
- 马云老师给AI留了几句话
- LeetCode 454. 4Sum II
- 20200108每日一句
- 率先驶入广州,百度Apollo“整车无人”车队街头开跑
- 序号47指标横向展示.xlsx_杭州增加2万个小客车指标!想拥有“浙A”车牌,这个APP一定要收好~...
- JavaWeb的学习(上)
- Java实现 蓝桥杯 算法训练 递归求二项式系数