题目描述

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

请写一个程序,用来计算至少需要设置几个救援出口,以及不同最少救援出口的设置方案总数。

输入输出格式

输入格式:

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

输出格式:

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

输入输出样例

输入样例#1:

9
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

输出样例#1:

Case 1: 2 4
Case 2: 4 1

说明

Case 1 的四组解分别是(2,4),(3,4),(4,5),(4,6);

Case 2 的一组解为(4,5,6,7)。

真tm神题。

【分析】 
这就是求割点嘛…因为去掉一个点整个图不连通就要加入答案了。 
但是只断一条边,所以如果删除割点后的某个联通块相连的割点个数>=2,那么这个联通块内部不用设置救援。 
注意:如果整个图就是一个双联通分量,那么方案数=(n*(n-1)/2)

以上内容摘自chaijing的blog

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int M=505;
int n,m,cnt,T,t,tim,num,sz,hd[M],dfn[M],low[M];
long long ans;
bool b[M],vis[M],ha[M];
struct edge
{int to,nxt;
}v[M];
void addedge(int x,int y)
{v[++cnt].to=y;v[cnt].nxt=hd[x];hd[x]=cnt;
}
void tarjan(int u,int fa)
{int ch=0;dfn[u]=low[u]=++tim;for(int i=hd[u];i;i=v[i].nxt)if(v[i].to!=fa){if(!dfn[v[i].to]){tarjan(v[i].to,u);ch++;low[u]=min(low[u],low[v[i].to]);if(dfn[u]<=low[v[i].to])b[u]=1;}elselow[u]=min(low[u],dfn[v[i].to]);}if(!fa&&ch==1)b[u]=0;
}
void dfs(int u,int fa)
{vis[u]=1;num++;for(int i=hd[u];i;i=v[i].nxt)if(v[i].to!=fa){if(!vis[v[i].to]&&!b[v[i].to])dfs(v[i].to,u);else if(b[v[i].to]&&!ha[v[i].to])ha[v[i].to]=1,sz++;}
}
int main()
{while(scanf("%d",&m)&&m){cnt=0;ans=1;t=0;tim=0;n=0;memset(dfn,0,sizeof(dfn));memset(low,0,sizeof(low));memset(hd,0,sizeof(hd));memset(b,0,sizeof(b));memset(vis,0,sizeof(vis));for(int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);addedge(x,y),addedge(y,x);n=max(n,max(x,y));}for(int i=1;i<=n;i++)if(!dfn[i])tarjan(i,0);for(int i=1;i<=n;i++)if(!vis[i]&&!b[i]){memset(ha,0,sizeof(ha));num=sz=0;dfs(i,0);if(sz==1)t++,ans*=(long long)num;}if(!t){ans=(long long)n*(n-1)/2;printf("Case %d: 2 %lld\n",++T,ans);}elseprintf("Case %d: %d %lld\n",++T,t,ans);}return 0;
}

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

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

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

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

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

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

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

  4. P3225 [HNOI2012]矿场搭建

    思路:$tarjan+组合$ 提交:1次 题解: 先$tarjan$求出割点,然后按连通块的性质分类讨论: 1.若没有与割点相连,则需要两个井,防止一个坏掉. 2.若有一个割点相连,修一个井,考虑井坏 ...

  5. P3225 [HNOI2012] 矿场搭建

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

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

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

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

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

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

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

  9. BZOJ 2733 | 洛谷 P3224 [HNOI2012]永无乡

    https://www.lydsy.com/JudgeOnline/problem.php?id=2733 https://www.luogu.org/problemnew/show/P3224 C+ ...

最新文章

  1. -bash: /usr/java/jdk1.8.0_101/bin/java: Permission denied
  2. net_conv1_conv2_conv3_conv4_py
  3. 增强型的for循环linkedlist_Java: 增强for循环针对list的时候,是严格按照list的顺序依次遍历的吗?...
  4. Homestead 集成开发环境配置
  5. C# WPF MVVM项目实战(进阶①)
  6. 【JS 逆向百例】网洛者反爬练习平台第五题:控制台反调试
  7. java lpad oracle_Oracal的Lpad函数
  8. WinMerge使用
  9. Unity设置和显示FPS
  10. 学习游戏两不误 测机械革命钛钽Plus旗舰游戏本
  11. 要学习使用的安全工具
  12. UI库你应该知道的基础(超实用)
  13. 统计学习方法 学习笔记(1)统计学习方法及监督学习理论
  14. Parametric Contrastive Learning:长尾问题中的对比学习
  15. 如何使用 WEB 技术编写前端代码,实现大屏展示和地图显示功能
  16. testng单元测试-diagnose依赖compet找不到compet的类
  17. 快速下载软件安装包IDM+KinhDown
  18. 在微信中分享下载APP或H5页面如何做好域名防封
  19. Windows 11 测试版 泄露版,微软下一代操作系统抢先下载
  20. linux shell 三元运算符,关于语法:Bash中的三元运算符(?:)

热门文章

  1. shell实现毫秒级时钟
  2. CuCrZr铬锆铜锻件//CuCrZr板材
  3. 首次服务器装系统教程,服务器安装系统教程
  4. 如何获取文本域(textarea) 的输入值
  5. 根据文件大小和属性计算音频时长,详解
  6. 鲸鱼算法(WOA)优化支持向量机的数据回归预测,WOA-SVM回归预测,多输入单输出模型。
  7. 基于Umi搭建的个人Dva脚手架(五) - 可配置的搜索、弹窗组件封装
  8. ai中如何插入签名_如何在微信公众号文章排版中插入趣味问答互动样式?
  9. Everyday genius 书山有路勤为径 学海无涯苦作舟
  10. php ems 框架,phpems数据库设计