思路:$tarjan+组合$

提交:1次

题解:

先$tarjan$求出割点,然后按连通块的性质分类讨论:

1.若没有与割点相连,则需要两个井,防止一个坏掉。

2.若有一个割点相连,修一个井,考虑井坏了从割点跑到相邻的连通块,或者割点坏了从井逃跑。

3.若有两个割点相连,则不用修井,直接跑到相邻连通块。

#include<cstdio>
#include<iostream>
#include<cstring>
#define R register int
const int M=510;
using namespace std;
inline int g() {R ret=0,fix=1; register char ch; while(!isdigit(ch=getchar())) fix=ch=='-'?-1:fix;do ret=ret*10+(ch^48); while(isdigit(ch=getchar())); return ret*fix;
}
int n,m,num,cnt,deg,ans,T,rt,tot,C;
long long anss;
int vr[M<<1],nxt[M<<1],fir[M],dfn[M],low[M],c[M];
bool cut[M];
inline void add(int u,int v) {vr[++cnt]=v,nxt[cnt]=fir[u],fir[u]=cnt;}
inline void clear() {memset(fir,0,sizeof(fir)),memset(c,0,sizeof(c));memset(cut,0,sizeof(cut)),memset(dfn,0,sizeof(dfn));num=cnt=tot=n=ans=T=0; anss=1;
}
inline void tarjan(int u) { dfn[u]=low[u]=++num; R deg=0;for(R i=fir[u];i;i=nxt[i]) { R v=vr[i];if(!dfn[v]) {tarjan(v); low[u]=min(low[u],low[v]);if(dfn[u]<=low[v]&&(++deg>1||rt!=u)) cut[u]=true;} else low[u]=min(low[u],dfn[v]);}
}
inline void dfs(int u) {c[u]=C; ++cnt;for(R i=fir[u];i;i=nxt[i]) { R v=vr[i];if(cut[v]&&c[v]!=C) ++tot,c[v]=C;if(!c[v]) dfs(v);}
}
signed main() { R t=0;while(m=g(),m!=0) { clear();for(R i=1,u,v;i<=m;++i) u=g(),v=g(),add(u,v),add(v,u),n=max(n,max(u,v));for(R i=1;i<=n;++i) if(!dfn[i]) rt=i,tarjan(i);for(R i=1;i<=n;++i) if(!c[i]&&!cut[i]) {++C; cnt=tot=0;dfs(i); if(!tot) ans+=2,anss*=cnt*(cnt-1)/2;if(tot==1) ++ans,anss*=cnt;} printf("Case %d: %d %lld\n",++t,ans,anss);}
}


2019.07.22

转载于:https://www.cnblogs.com/Jackpei/p/11225128.html

P3225 [HNOI2012]矿场搭建相关推荐

  1. 洛谷——P3225 [HNOI2012]矿场搭建

    P3225 [HNOI2012]矿场搭建 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤 ...

  2. P3225 [HNOI2012]矿场搭建 割点 tarjan 双联通分量

    https://www.luogu.org/problemnew/show/P3225  题意 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一 ...

  3. 洛谷 P3225 [HNOI2012]矿场搭建

    题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一个挖煤点坍塌之 ...

  4. P3225 [HNOI2012] 矿场搭建

    题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一个挖煤点坍塌之 ...

  5. 点双连通分量 [HNOI2012]矿场搭建

    问题 F: [HNOI2012]矿场搭建 时间限制: 1 Sec  内存限制: 128 MB 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人 ...

  6. bzoj 2730: [HNOI2012]矿场搭建——tarjan求点双

    Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一 ...

  7. [BZOJ2730][HNOI2012]矿场搭建(求割点)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2730 分析: 如果坍塌的点不是割点,那没什么影响,主要考虑坍塌的点是割点的情况. 显然 ...

  8. Tarjan水题系列(2):HNOI2012 矿场搭建

    题目: 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一个挖煤点坍塌之后 ...

  9. LOJ洛谷P3225:矿场搭建(割点、点双)

    文章目录 解析 代码 解析 我的实现不够简洁,导致bug越调越谜- 关键就是**找被割点分开的分量的方法:dfs!!! 一下子就豁然开朗了 代码 #include<bits/stdc++.h&g ...

最新文章

  1. java 中调用window系统中的文件,或者执行命令(shell、.CMD、.EXE)并获取返回值
  2. 【商务智能】商务智能 ( 概念 | 组成 | 过程 )
  3. Git 进阶之底层相关
  4. excel 数据导入(附工具类)
  5. WP7 App性能优化(8):检测应用程序性能(Ⅰ)
  6. 2011年5月19日盘后分析:把握行情运行主线 静待大盘明确信号
  7. new 一个模板、类_Java必备基础-类(Class)
  8. 线程同步机制:互斥量、信号量、读写锁、条件变量
  9. 【linux】安装centOS过程中遇到的困难
  10. 近7成开发者无开源收入、最想操作系统开源、Java最受欢迎 | 揭晓中国开源开发者现状...
  11. 【洛谷1962】 斐波那契数列
  12. to teacher eulogy
  13. 01组-选题与需求分析报告
  14. autohotkey-大漠插件
  15. 中国的开源之夏来了!
  16. MATLAB中把Excel数据矩阵化,excel将表格数据矩阵-MATLAB怎么读取EXCEL中矩阵形式的数据,并存放在一......
  17. 【抓包】- Fiddle软件异常错误,Fiddler Failed to register Fiddler as the system proxy,解决方法
  18. 闵帆老师《论文写作》心得体会
  19. 计算机连接网络被限制,wifi连接被限制怎么办,教您wifi显示网络受限如何解决
  20. app小程序手机端Python爬虫实战01-Uiautomator2自动化抓取工具介绍

热门文章

  1. 焦油坑和人月神话--人月笔记1
  2. 华为eNSP模拟器学习(一)
  3. 亚信安全中标民生银行防病毒项目 为“互联网+金融”革新防护能力
  4. Vijos P1756 数字反转【进制】
  5. 复制虚拟机网卡eth0变eth1
  6. 在leangoo里怎么复制删除列表?
  7. Overview-ISA-2004-SP3
  8. 目标检测学习笔记--DSSD算法
  9. 【数据挖掘笔记七】高级模式挖掘
  10. 【Python-ML】SKlearn库网格搜索和交叉验证