【HNOI2012】bzoj2730 矿场搭建 【解法一】

2023-11-07 21:18

本文主要是介绍【HNOI2012】bzoj2730 矿场搭建 【解法一】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Description
煤矿工地可以看成是由隧道连接挖煤点组成的无向图。为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处。于是矿主决定在某些挖煤点设立救援出口,使得无论哪一个挖煤点坍塌之后,其他挖煤点的工人都有一条道路通向救援出口。请写一个程序,用来计算至少需要设置几个救援出口,以及不同最少救援出口的设置方案总数。
Input

输入文件有若干组数据,每组数据的第一行是一个正整数 N(N≤500),表示工地的隧道数,接下来的 N 行每行是用空格隔开的两个整数 S 和
T,表示挖 S 与挖煤点 T 由隧道直接连接。输入数据以 0 结尾。 Output

输入文件中有多少组数据,输出文件 output.txt 中就有多少行。每行对应一组输入数据的 结果。其中第 i 行以 Case i:
开始(注意大小写,Case 与 i 之间有空格,i 与:之间无空格,: 之后有空格),其后是用空格隔开的两个正整数,第一个正整数表示对于第
i 组输入数据至少需 要设置几个救援出口,第二个正整数表示对于第 i 组输入数据不同最少救援出口的设置方案总 数。输入数据保证答案小于
2^64。输出格式参照以下输入输出样例。

解法二见【这里】
很明显跟bcc有关。那么先用tarjan求出bcc。
经过分析可以发现,当且仅当一个bcc只含有一个割点时,在它内部需要有一个出口。出口的选择方案是非割点的任何一个点。
但是注意一种特殊情况,即整张图就是自己的bcc,那么需要两个出口,方案数为n(n-1)/2。

#include<cstdio>
#include<cstring>
#include<vector>
#include<stack>
#include<iostream>
using namespace std;
#define M(a) memset(a,0,sizeof(a))
struct edge
{int f,t;
}e1,e2;
stack<edge> sta;
vector<edge> vec[1010];
vector<int> bcc[1010];
int m,n,clo,tot,dfn[1010],low[1010],bel[1010];
bool is[1010];
void in()
{int i,j,k,x,y,z;while (!sta.empty()) sta.pop();for (i=1;i<=1005;i++)vec[i].clear(),bcc[i].clear();tot=clo=n=0;M(dfn);M(low);M(is);M(bel);for (i=1;i<=m;i++){scanf("%d%d",&x,&y);vec[x].push_back((edge){x,y});vec[y].push_back((edge){y,x});n=max(n,x);n=max(n,y);}
}
void dfs(int x,int fa)
{int i,j,k,p,q,u,v,cnt=0;dfn[x]=low[x]=++clo;for (i=0;i<vec[x].size();i++)if (vec[x][i].t!=fa){u=vec[x][i].t;if (!dfn[u]){sta.push(vec[x][i]);dfs(u,x);cnt++;low[x]=min(low[x],low[u]);if (low[u]>=dfn[x]){is[x]=1;tot++;while (1){e1=sta.top();sta.pop();if (bel[e1.f]!=tot){bel[e1.f]=tot;bcc[tot].push_back(e1.f);}if (bel[e1.t]!=tot){bel[e1.t]=tot;bcc[tot].push_back(e1.t);}if (e1.f==x&&e1.t==u) break;}}}else{if (dfn[u]<dfn[x]) sta.push(vec[x][i]);low[x]=min(low[x],dfn[u]);}}if (fa==-1&&cnt==1) is[x]=0;
}
void find()
{for (int i=1;i<=n;i++)if (!dfn[i])dfs(i,-1);
}
void out()
{int i,j,k,cnt;long long ans1=0,ans2=1;if (tot==1){printf("2 %lld\n",(long long)n*(n-1)/2);return;}for (i=1;i<=tot;i++){cnt=0;for (j=0;j<bcc[i].size();j++)if (is[bcc[i][j]]) cnt++;if (cnt==1){ans1++;ans2*=(bcc[i].size()-1);}}printf("%lld %lld\n",ans1,ans2);
}
int main()
{int K=0;while (scanf("%d",&m)&&m){printf("Case %d: ",++K);in();find();out();}
}

这篇关于【HNOI2012】bzoj2730 矿场搭建 【解法一】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/366331

相关文章

poj 3974 and hdu 3068 最长回文串的O(n)解法(Manacher算法)

求一段字符串中的最长回文串。 因为数据量比较大,用原来的O(n^2)会爆。 小白上的O(n^2)解法代码:TLE啦~ #include<stdio.h>#include<string.h>const int Maxn = 1000000;char s[Maxn];int main(){char e[] = {"END"};while(scanf("%s", s) != EO

搭建Kafka+zookeeper集群调度

前言 硬件环境 172.18.0.5        kafkazk1        Kafka+zookeeper                Kafka Broker集群 172.18.0.6        kafkazk2        Kafka+zookeeper                Kafka Broker集群 172.18.0.7        kafkazk3

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

pico2 开发环境搭建-基于ubuntu

pico2 开发环境搭建-基于ubuntu 安装编译工具链下载sdk 和example编译example 安装编译工具链 sudo apt install cmake gcc-arm-none-eabi libnewlib-arm-none-eabi libstdc++-arm-none-eabi-newlib 注意cmake的版本,需要在3.17 以上 下载sdk 和ex

JavaFX环境的搭建和一个简单的例子

之前在网上搜了很多与javaFX相关的资料,都说要在Eclepse上要安装sdk插件什么的,反正就是乱七八糟的一大片,最后还是没搞成功,所以我在这里写下我搭建javaFX成功的环境给大家做一个参考吧。希望能帮助到你们! 1.首先要保证你的jdk版本能够支持JavaFX的开发,jdk-7u25版本以上的都能支持,最好安装jdk8吧,因为jdk8对支持JavaFX有新的特性了,比如:3D等;

springboot+maven搭建的项目,集成单元测试

springboot+maven搭建的项目,集成单元测试 1.在pom.xml文件中引入单元测试的依赖包 <!--单元测试依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></depen

CentOS 7 SVN的搭建和使用

https://subversion.apache.org/packages.html#centos 阿里云的ECS貌似已经自带了SVN [root@xxx ~]# svn --versionsvn, version 1.7.14 (r1542130)compiled Aug 23 2017, 20:43:38Copyright (C) 2013 The Apache Software Fo

2021-08-14 react笔记-1 安装、环境搭建、创建项目

1、环境 1、安装nodejs 2.安装react脚手架工具 //  cnpm install -g create-react-app 全局安装 2、创建项目 create-react-app [项目名称] 3、运行项目 npm strat  //cd到项目文件夹    进入这个页面  代表运行成功  4、打包 npm run build

搭建H1veCTF平台

An Easy / Quick / Cheap Integrated Platform H1ve是一款自研CTF平台,同时具备解题、攻防对抗模式。其中,解题赛部分对Web和Pwn题型,支持独立题目容器及动态Flag防作弊。攻防对抗赛部分支持AWD一键部署,并配备炫酷地可视化战况界面。 项目地址:https://github.com/D0g3-Lab/H1ve 更多请打开。。。

day45-测试平台搭建之前端vue学习-基础4

目录 一、生命周期         1.1.概念         1.2.常用的生命周期钩子         1.3.关于销毁Vue实例         1.4.原理​编辑         1.5.代码 二、非单文件组件         2.1.组件         2.2.使用组件的三大步骤         2.3.注意点         2.4.关于VueComponen