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]矿场搭建 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤 ...
随机推荐
- 使用net命令启动MongoDB服务发生系统错误,返回值为5
使用net命令启动MongoDB服务发生系统错误,返回值为5 错误的截图如下: 解决的方案是以管理员的身份运行命令窗口,参考如下: https://www.cnblogs.com/fanblogs/p ...
- Vue-Router的简单使用
Vue-Router的最简单使用 1.先注册路由 2.将路由注册到VM组件中 3.定义组件 4.页面定义跳转路径 <!DOCTYPE html> <html> <head ...
- EF大数据插入
_April给出代码: using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotati ...
- SQL基础测试
SQL 测验 结果:20/20 您的回答: 1.SQL 指的是? 您的回答:Structured Query Language 2.哪个 SQL 语句用于从数据库中提取数据? 您的回答:SELECT ...
- create-react-app+react-app-rewired引入antd实践
注:模块化按此方发npm install antd --save npm install babel-plugin-import --save-dev npm install react-app-re ...
- #419 Div2 Problem C Karen and Game (贪心 && 暴力)
题目链接:http://codeforces.com/contest/816/problem/C 题意 :给出一个 n*m 的变化后的矩阵,变化前矩阵的元素全是0,变化的规则是选择其中的一行或者一列将 ...
- ELK结合logback
之前ELK的安装可以查看前面一篇博客 下面是我的logback的配置文件,通过logback的appender直接导入logstash <?xml version="1.0" ...
- Android事件分发详解(六)——ACTION_DOWN的消费验证
MainActivity如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 3 ...
- AtCoder AGC002F Leftmost Ball (DP、组合计数)
题目链接: https://atcoder.jp/contests/agc002/tasks/agc002_f 题解: 讲一下官方题解的做法: 就是求那个图(官方题解里的)的拓扑序个数,设\(dp[i ...
- es之索引的别名操作
1:增加别名 为索引school添加一个别名alias1: 1.1:创建索引 PUT student{ "settings": {"number_of_shards&qu ...