洛谷 P3225 [HNOI2012]矿场搭建 解题报告
P3225 [HNOI2012]矿场搭建
题目描述
煤矿工地可以看成是由隧道连接挖煤点组成的无向图。为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处。于是矿主决定在某些挖煤点设立救援出口,使得无论哪一个挖煤点坍塌之后,其他挖煤点的工人都有一条道路通向救援出口。
请写一个程序,用来计算至少需要设置几个救援出口,以及不同最少救援出口的设置方案总数。
输入输出格式
输入格式:
输入文件有若干组数据,每组数据的第一行是一个正整数 N(N<=500),表示工地的隧道数,接下来的 N 行每行是用空格隔开的两个整数 S 和 T,表示挖 S 与挖煤点 T 由隧道直接连接。输入数据以 0 结尾。
输出格式:
输入文件中有多少组数据,输出文件 output.txt 中就有多少行。每行对应一组输入数据的 结果。其中第 i 行以 Case i: 开始(注意大小写,Case 与 i 之间有空格,i 与:之间无空格,: 之后有空格),其后是用空格隔开的两个正整数,第一个正整数表示对于第 i 组输入数据至少需 要设置几个救援出口,第二个正整数表示对于第 i 组输入数据不同最少救援出口的设置方案总 数。输入数据保证答案小于 2^64。输出格式参照以下输入输出样例。
最开始想的是统计把所有割点割掉之后联通分量的块数,就没怎么想了10分,谁知道这题是个分类讨论。
我们讨论最初的每个联通分量。
- 当这个联通分量是个双联通分量,即没有割点的联通分量时。
若这个联通分量大小是1,则一定出口++,方案不变。
若这个联通分量大小大于1,则出口设2个(防止某个出口被爆),方案乘上\(C_n^2\),\(n\)为联通块大小。 - 当这个联通分量存在割点时。
我们讨论分离出割点后它的每一个双联通分量。
若它的一个双联通分量(整体)与一个割点相连,则出口++,方案乘上双联通分量大小。
原因:当双联通分量中的点爆掉后,从割点跑(到另外的双联通分量);当割点爆掉后,从双联通分量中设的点跑。
若它的一个双联通分量与至少两个割点相连,这个双联通分量不用设出口,因为不管是割点爆还是里面爆,都可以向另外的双联通分量跑。
对于为什么跑向别的双联通分量后一定有出口,可以这么想,对于每一个 有很多个割点与双联通分量相连构成的 联通分量,至少存在两端是 与一个割点连接的双联通分量,这样的双联通分量是一定要设出口的。
code:
#include <cstdio>
#include <cstring>
#define ll long long
int min(int x,int y){return x<y?x:y;}
const int N=504;
struct Edge
{
int to,next;
}edge[N<<1];
int head[N],cnt=0;
void add(int u,int v)
{
edge[++cnt].next=head[u];edge[cnt].to=v;head[u]=cnt;
}
int dfn[N<<1],low[N<<1],vis[N<<1],used[N<<1],is[N<<1];
int m,n,k=0,time=0;
ll ans1,ans2,siz,cut;
void tarjan(int now,int fa)
{
int child=0;
dfn[now]=low[now]=++time;
for(int i=head[now];i;i=edge[i].next)
{
int v=edge[i].to;
if(!dfn[v])
{
tarjan(v,fa);
low[now]=min(low[now],low[v]);
if(low[v]>=dfn[now]&&now!=fa)
vis[now]=1;
if(now==fa) child++;
}
low[now]=min(low[now],dfn[v]);
}
if(fa==now&&child>1)
vis[now]=1;
}
void dfs(int now)
{
used[now]=1;
siz++;
for(int i=head[now];i;i=edge[i].next)
{
int v=edge[i].to;
if(!vis[v]&&!used[v]) dfs(v);
if(vis[v]&&!is[v]) cut++,is[v]=1;
}
}
void init()//记得待会检查全不全
{
memset(head,0,sizeof(head));
memset(used,0,sizeof(used));
memset(vis,0,sizeof(vis));
memset(dfn,0,sizeof(dfn));
memset(low,0,sizeof(low));
cnt=0,n=0,time=0,ans1=0,ans2=1,cnt=0,k++;
}
int main()
{
scanf("%d",&m);
while(m)
{
init();
int u,v;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&u,&v);
add(u,v),add(v,u);
if(!used[u])
{
used[u]=1;
n++;
}
if(!used[v])
{
used[v]=1;
n++;
}
}
for(int i=1;i<=n;i++)
if(!dfn[i]&&!vis[i])
tarjan(i,i);
memset(used,0,sizeof(used));
for(int i=1;i<=n;i++)
if(!vis[i]&&!used[i])
{
siz=0;
cut=0;
memset(is,0,sizeof(is));
dfs(i);
if(!cut)
{
if(siz!=1)
{
ans1+=2;
ans2*=siz*(siz-1)/2;
}
else
ans1++;
}
else if(cut==1)
{
ans1++;
ans2*=siz;
}
}
printf("Case %d: %lld %lld\n",k,ans1,ans2);
scanf("%d",&m);
}
}
2018.6.8
洛谷 P3225 [HNOI2012]矿场搭建 解题报告的更多相关文章
- 洛谷——P3225 [HNOI2012]矿场搭建
P3225 [HNOI2012]矿场搭建 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤 ...
- 洛谷P3225 HNOI2012 矿场搭建
题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一个挖煤点坍塌之 ...
- 洛谷 P3225 [HNOI2012]矿场搭建
传送门 题目大意:建设几个出口,使得图上无论哪个点被破坏,都可以与出口联通. 题解:tarjian求割点 首先出口不能建在割点上,找出割点,图就被分成了几个联通块. 每个联通块,建出口.如果割点数为0 ...
- 洛谷—— P3225 [HNOI2012]矿场搭建
https://www.luogu.org/problem/show?pid=3225 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有 ...
- BZOJ2730或洛谷3225 [HNOI2012]矿场搭建
BZOJ原题链接 洛谷原题链接 显然在一个点双连通分量里,无论是哪一个挖煤点倒塌,其余挖煤点就可以互相到达,而对于一个点双连通分量来说,与外界的联系全看割点,所以我们先用\(tarjan\)求出点双连 ...
- 洛谷_Cx的故事_解题报告_第四题70
1.并查集求最小生成树 Code: #include <stdio.h> #include <stdlib.h> struct node { long x,y,c; ...
- 洛谷 P2317 [HNOI2005]星际贸易 解题报告
P2317 [HNOI2005]星际贸易 题目描述 输入输出格式 输入格式: 输出格式: 如果可以找到这样的方案,那么输出文件output.txt中包含两个整数X和Y.X表示贸易额,Y表示净利润并且两 ...
- 洛谷 P3802 小魔女帕琪 解题报告
P3802 小魔女帕琪 题目背景 从前有一个聪明的小魔女帕琪,兴趣是狩猎吸血鬼. 帕琪能熟练使用七种属性(金.木.水.火.土.日.月)的魔法,除了能使用这么多种属性魔法外,她还能将两种以上属性组合,从 ...
- 洛谷 P2606 [ZJOI2010]排列计数 解题报告
P2606 [ZJOI2010]排列计数 题目描述 称一个\(1,2,...,N\)的排列\(P_1,P_2...,P_n\)是\(Magic\)的,当且仅当对所以的\(2<=i<=N\) ...
随机推荐
- Part 5:Django测试--Django从入门到精通系列教程
该系列教程系个人原创,并完整发布在个人官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及www.liujiangblog.com官网地址. 本节将简要介绍Django的自动化测试相关内 ...
- C# 调用微信接口上传素材和发送图文消息
using Common;using Newtonsoft.Json.Linq;using System;using System.IO;using System.Net;using System.T ...
- C# 获取文件MD5值的方法
可用于对比文件是否相同 /// <summary> /// 获取文件MD5值 /// </summary> /// <param name="fileName& ...
- Visual Studio2017 Remote Debugger
前言 大家在使用vs打包后的文件部署到服务器后,有时候我们需要对线网的后台进行调试.但是它不像在VS中.这个时候我们该怎么调试呢? 微软想到了这一点,他们在 VS 中给我们提供了一个功能: Remot ...
- python报错问题解决:'ascii' codec can't encode character
之前部署了openstack虚拟化环境,有一天在使用nova list查看虚拟机的时候,突然报错!如下: [root@linux-node1 src]# nova listERROR (Unicode ...
- 【2016.3.19】作业 分析一个很有(wu)趣(liao)的小程序
问题1:这个程序要找的是符合什么条件的数? 能够整除2-32中所有数仅除了在此之中的两个相邻的数,比如能整除2-29,且不能整除30,31.当然,这只是举个例子. 问题2:这样的数存在么?符合这一条件 ...
- Linux内核分析——字符集总结与分析
一. 设置修改系统.应用默认字符集 1. 查看虚拟机的字符集: 由此可见,该虚拟机的字符集为zh_CN.UTF-8. 2. 查看服务器支持的编码方式 3. 修改字符集类型 上图可见,LANG字符 ...
- MyEclipse项目里面出现红叉的解决方案?
一般出现在从别处import的项目上,只有项目文件夹上有红叉,其他地方都正常,现总结个人的几个解决方案: 有几种可能: 1,编码设置是否一致,也即是你项目原来的编码和现在eclipse用的默认编码 ...
- python中的hasattr()、getattr()、setattr()
hasattr()的用法和理解--hasattr(obj, target) 判断对象obj中是否含有,目标target属性,然后返回布尔值,如果有返回True,没有返回False. >>& ...
- 链表数据结构(C/C++语言实现)
注意:没有使用malloc和free:加了一个头文件,用于清屏和暂停:还有就是一个错误特别容易被忽略,那就是主函数中声明了LinkList p,然后就直接创建链表,忘了给p分配空间.一定要先初始化链表 ...