Tarjan水题系列(2):HNOI2012 矿场搭建
题目:
煤矿工地可以看成是由隧道连接挖煤点组成的无向图。为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处。于是矿主决定在某些挖煤点设立救援出口,使得无论哪一个挖煤点坍塌之后,其他挖煤点的工人都有一条道路通向救援出口。
请写一个程序,用来计算至少需要设置几个救援出口,以及不同最少救援出口的设置方案总数。
大意:
求 在一个无向图中放若干特殊点 使删除任意一个节点后剩下的每一个连通块中都有特殊点的最小特殊点个数与方案数
思路:
若删除的点不是割点 则对整张图无影响
若是割点 则图被分为若干连通块 每个连通块中都必须有特殊点
由于只有删除割点时才会影响图的连通块个数所以这里将图简化 变为一个个点复连通分量通过共有割点相连
很容易发现 若一个点复连通分量内只有一个割点 那么该割点删除后该分量将独立出去 故必须有一个特殊点
因为只有一个割点的点复连通分量至少有2个 即原连通图至少有2个特殊点 删除一个割点 原图最终至少剩下一个特殊点 所以有两个及以上割点的点复连通分量不会受到影响
0个割点时 要保留两个特殊点 删掉一个特殊点怎么玩?
至此算法已经显然易见了
下面是代码:
#include <cstdio>
#include <iostream>
#include <memory.h>
#define MAXX 600
#define MAX(a,b) (a>b?a:b)
#define MIN(a,b) (a<b?a:b)
#define r(x) x=read()
using namespace std;
typedef long long ll;
int fi,flag[MAXX],dfn[MAXX],low[MAXX],k,n,u,to,
cnt,sta[MAXX],ans2=,top,num,id[MAXX][MAXX],T[MAXX],h[MAXX],t;
ll ans=;
int read()
{
char ch=;int w=;
while(ch<''||ch>''){ch=getchar();}
while(ch>=''&&ch<=''){w=w*+ch-'';ch=getchar();}
return w;
}
struct edge{int to,nex;}e[MAXX<<];
void add(int u,int to)
{
cnt++;
e[cnt]=(edge){to,h[u]};
h[u]=cnt;
}
void tarjan(int now)
{
int tot=,sign=;
dfn[now]=low[now]=++k;
sta[++top]=now;
for(int i=h[now];i;i=e[i].nex)
{
if(!dfn[e[i].to])
{
tot++,tarjan(e[i].to),low[now]=MIN(low[now],low[e[i].to]);
if((fi==now&&tot>)||(low[e[i].to]>=dfn[now]&&fi!=now))
flag[now]=;
if(dfn[now]<=low[e[i].to])
{
num++;
while(sta[top]!=now)
{
id[num][++T[num]]=sta[top];
top--;
}
id[num][++T[num]]=now;
}
}
else
low[now]=MIN(low[now],dfn[e[i].to]);
}
}
void solve()
{
memset(h,,sizeof(h));
memset(dfn,,sizeof(dfn));
memset(T,,sizeof(T));
memset(flag,,sizeof(flag));
memset(low,,sizeof(low));
ans=,top=,k=,ans2=,cnt=,num=;
r(n);
if(n==) exit();
for(int i=;i<=n;++i)
r(u),r(to),add(u,to),add(to,u);
for(int i=;i<=;++i)
if(h[i]&&!dfn[i])
fi=i,tarjan(i);
for(int i=;i<=num;++i)
{
int len=T[i],z=;
for(int j=;j<=len;++j)
{
if(flag[id[i][j]]) z++;
}
if(z==) ans2+=,ans=ans*len*(len-)/;
else if(z==) ans2++,ans=ans*(len-);
}
printf("Case %d: %d %lld\n",t,ans2,ans);
}
int main()
{
while(){t++;solve();}
return ;
}
Tarjan水题系列(2):HNOI2012 矿场搭建的更多相关文章
- Tarjan水题系列(5):最大半连通子图 [ZJOI2007 luogu P2272]
题目 大意: 缩点后转为求最长链的长度和最长链的个数 思路: 看懂题就会做系列 长度和个数都可以拓扑排序后DP求得 毕竟是2007年的题 代码: 如下 #include <cstdio> ...
- Tarjan水题系列(4):HAOI2010 软件安装
题目: 现在我们的手头有N个软件,对于一个软件i,它要占用Wi的磁盘空间,它的价值为Vi.我们希望从中选择一些软件安装到一台磁盘容量为M计算机上,使得这些软件的价值尽可能大(即Vi的和最大). ...
- Tarjan水题系列(3):HNOI2006 潘多拉的魔盒
题目: 链接 大意: 盒子与盒子之间的关系构成一个有向图 求图上包含节点数最多的路径的节点数 思路: 有向图上求包含节点数最多的路径的节点数 可直接使用tarjan缩点后拓扑dp求得 在此不赘述 此题 ...
- Tarjan水题系列(1):草鉴定Grass Cownoisseur [USACO15JAN]or[luogu P3119]
题目如下: 约翰有n块草场,编号1到n,这些草场由若干条单行道相连.奶牛贝西是美味牧草的鉴赏家,她想到达尽可能多的草场去品尝牧草. 贝西总是从1号草场出发,最后回到1号草场.她想经过尽可能多的草场,贝 ...
- BZOJ 2730: [HNOI2012]矿场搭建( tarjan )
先tarjan求出割点.. 割点把图分成了几个双连通分量..只需dfs找出即可. 然后一个bcc有>2个割点, 那么这个bcc就不用建了, 因为一定可以走到其他救援出口. 只有一个割点的bcc就 ...
- 【BZOJ】2730: [HNOI2012]矿场搭建【Tarjan找割点】【分联通块割点个数】
2730: [HNOI2012]矿场搭建 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 3230 Solved: 1540[Submit][Stat ...
- Tarjan 点双+割点+DFS【洛谷P3225】 [HNOI2012]矿场搭建
P3225 [HNOI2012]矿场搭建 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤 ...
- 【BZOJ2730】[HNOI2012]矿场搭建 Tarjan
[BZOJ2730][HNOI2012]矿场搭建 Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处. ...
- 洛谷 P3225 [HNOI2012]矿场搭建 解题报告
P3225 [HNOI2012]矿场搭建 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤 ...
随机推荐
- hdu 3376 : Matrix Again【MCMF】
题目链接 题意:给定一个n*n的矩阵,找一条路,从左上角到右下角再到左上角,每个点最多经过一次,求路径上的点的权值的最大和. 将矩阵中每个点拆点,点容量为1,费用为点权值的相反数.每个点向自己右侧和下 ...
- 【leetcode】1201. Ugly Number III
题目如下: Write a program to find the n-th ugly number. Ugly numbers are positive integers which are div ...
- LeetCode - 删除链表的倒数第N个节点
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点. 示例: 给定一个链表: 1->2->3->4->5, 和 n = 2. 当删除了倒数第二个节点后,链表变为 ...
- sqlserver 返回刚插入的那条数据
insert into xxxxxx(Col_002,UrgentStatus,DoWorkShop,Col_004,Col_005,Col_006,Col_003,Col_007,postQQ,Co ...
- Linux培训教程 linux磁盘分区详解
在学习 Linux 的过程中,安装 Linux 是每一个初学者的第一个门槛.在这个过程中间,最大的困惑莫过于给硬盘进行分区.虽然,现在各种发行版本的 Linux 已经提供了友好的图形交互界面,但是很多 ...
- UVa 213 信息解码 (模拟 && 二进制)
题意 :对于下面这个字符串 0,00,01,10,000,001,010,011……. 首先是长度为1的串,然后是长度为2的串,以此类推.不存在全为1的串. 你的任务是编写一个程序.首先输入一个代码头 ...
- BZOJ 2731 Luogu P3219 [HNOI2012]三角形覆盖问题 (扫描线)
题目链接: (bzoj)https://www.lydsy.com/JudgeOnline/problem.php?id=2731 (luogu)https://www.luogu.org/probl ...
- [design pattern](5) Factory Method
前言 在前面一章博主介绍了简单工厂模式(Simple Factory),接着上面的章节,今天博主就来介绍下工厂方法模式(Factory Method). 思考题 首先,让我们来思考下面的问题: 在上一 ...
- 高级软件测试技术-任务进度和总结-Day04
任务进度11-16 使用工具 Jira 小组成员 华同学.郭同学.穆同学.沈同学.覃同学.刘同学 任务进度 经过了这几天的学习和小组成员的努力,虽然其中还准备了考试,但是大家还是最终按时完成了任务,今 ...
- MySQL的explain分析sql语句
explain分析查询 使用 EXPLAIN 关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的.这可以帮你分析你的查询语句或是表结构的性能瓶颈.通过explain命 ...