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]矿场搭建 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤 ...
随机推荐
- shell练习--PAT题目1008:数组元素循环右移问题 (失败案例,运行超时)
一个数组A中存有N(>)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥)个位置,即将A中的数据由(A0A1⋯AN−1)变换为(AN−M⋯AN−1A ...
- 引用自定义的css或者js文件
用script标签,src是js文件路径 <script type="text/javascript" src="./js/udc.js">< ...
- html aside标签 语法
html aside标签 语法 aside是什么意思? aside为语义化标签,通常用来描述与文档主体内容不相关的内容,其aside标签的内容应该与附近的内容相关. 作用:定义其所处内容之外的内容.直 ...
- CodeForces 1200E Compress Words
\(C_n^m\)的typora,点了一下启用源代码模式就把我已经写好的博客弄没了,就给我留个标题,自动保存也只给我保存了个标题--\(C_n^m\),wdnmd Time limit 1000 ms ...
- Python字典实现
这篇文章描述了在Python中字典是如何实现的. 字典通过键(key)来索引,它可以被看做是关联数组.我们在一个字典中添加3个键/值对: >>> d = {'a': 1, 'b': ...
- prometheus 监控项
此处记录prometheus监控项,exporter为 node_exporter vim rules.yml groups: - name: node rules: - alert: server_ ...
- loj#6038 「雅礼集训 2017 Day5」远行
分析 代码 #include<bits/stdc++.h> using namespace std; #define fi first #define se second #define ...
- JAVA中对null进行强制类型转换(null可以强转为任意对象,并执行对象的静态方法)
今天很好奇,对null进行强转会不会抛错.做了如下测试得到的结果是, 如果把null强转给对象,是不会抛异常的,本身对象是可以为null的. 但是如果是基本类型,比如 int i = (Integer ...
- Unity Audio Source Properties
Audio Clip 音频剪辑 将播放声音的剪辑文件 Mute 静音 Bypass Effects 直通效果 应用音频源的快速“直通”过滤效果.一个简单的方法来打开/关闭所有特效 Output 产量 ...
- 中国MOOC_零基础学Java语言_第4周 循环控制_1素数和
第4周编程题 查看帮助 返回 第4周编程题 依照学术诚信条款,我保证此作业是本人独立完成的. 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截 ...