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]矿场搭建 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤 ...
随机推荐
- Linux系统如何选择MongoDB版本
mogodb各个版本该怎么选: 如下图所示,我们可以看到有许多版本的安装包,那我们选择下载哪个呢?下面我会讲解一下: 我们发现主要有6种,分别是 : Amazon Linux(亚马逊). Debian ...
- SpringCloud学习系列-Eureka服务注册与发现(2)
构建 microservicecloud-eureka-7001 eureka服务注册中心Module 1.新建microservicecloud-eureka-7001 2.pom <proj ...
- 【知识】location.search获取中文时候会被编码成一串字符
[转码] 例如:case.html?id='这个是页面的标题' 当想要使用location.search获取?id='这个是页面的标题'的时候,包含的中文会被编码成一串字符串. 所以我们需要进行解码, ...
- linux的字符集转换
命令查看编码类型 查看命令参数 查看支持的字符集 将文件转换成utf-8 的文件(经测试比较鸡肋,不好用) [root@ag-1 hh]# iconv oldboy -f us-ascii -t ut ...
- BZOJ 4011: [HNOI2015]落忆枫音 计数 + 拓扑排序
Description 「恒逸,你相信灵魂的存在吗?」 郭恒逸和姚枫茜漫步在枫音乡的街道上.望着漫天飞舞的红枫,枫茜突然问出 这样一个问题. 「相信吧.不然我们是什么,一团肉吗?要不是有灵魂……我们 ...
- Shell中Bash的基本功能(二)
1 历史命令 1)历史命令的查看[root@localhost ~]# history [选项] [历史命令保存文件]选项:-c: 清空历史命令-w: 把缓存中的历史命令写入历史命令保存文件.如果不手 ...
- 字符串处理工具StringUtils
package yqw.java.util; import java.io.File;import java.text.ParseException;import java.text.SimpleDa ...
- C# walls
在学习C#的阶段中,我们一点一点的往前爬, 此代码需要添加selenium ,和 获取 引用. using Ivony.Html.Parser; using Ivony.Html; using Ope ...
- java复制项目中的补丁,完整的包路径
package com.bytter.audit.iface.util; import java.io.BufferedInputStream; import java.io.BufferedOutp ...
- angular 的配置文件的应用
为什么要使用 angular 的配置文件: 好处:我们可以在一个页面上,实现多个页面的跳转的感觉,但只是在一个页面上进行的操作: 我们的准备工作:下载 angular-route.js 插件 在依赖模 ...