正题

题目链接:https://www.luogu.org/problemnew/show/P3225


题目大意

nnn个点的无向图,要求设置逃生点使得任意一个点去掉后每联通分量内都有一个逃生点。求至少多少个逃生点和方案数。


解题思路

首先tarjantarjantarjan求出割点,然后对于一个分量内没有割点,那么就得设置两个点,如果有一个割点,就要设置一个。
然后方案数直接用联通分量内的点数来求。


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 500
#define ll long long
using namespace std;
struct line{ll to,next;
}a[N*N];
ll tot,ls[N],v[N],dfn[N],low[N],num,Case;
ll n,cut[N],ans1,ans2,m,sonn,grade,cnt,Cut;
void addl(ll x,ll y)
{a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;
}
void tarjan(ll x,ll fa)
{dfn[x]=low[x]=++num;ll L=0;for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(!dfn[y]){tarjan(y,x);low[x]=min(low[y],low[x]);if(dfn[x]<=low[y]){cut[x]=1;if(fa==0) sonn++;}}else if(y!=fa)low[x]=min(dfn[y],low[x]);}
}
void dfs(ll x)
{v[x]=grade;cnt++;for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(cut[y]&&v[y]!=grade){Cut++;v[y]=grade;}if(!v[y]) dfs(y);}
}
int main()
{while(1){memset(cut,0,sizeof(cut));memset(dfn,0,sizeof(dfn));memset(low,0,sizeof(low));memset(ls,0,sizeof(ls));memset(v,0,sizeof(v));Case++;tot=grade=ans1=grade=num=n=0;ans2=1;scanf("%lld",&m);if(!m) break;for (ll i=1;i<=m;i++){ll x,y;scanf("%lld%lld",&x,&y);n=max(n,max(x,y));addl(x,y);addl(y,x);}for(ll i=1;i<=n;i++){if(dfn[i]) continue;sonn=0;tarjan(i,0);if(sonn<2) cut[i]=0;}for(ll i=1;i<=n;i++){if(!v[i]&&!cut[i]){grade++;cnt=Cut=0;dfs(i);if(Cut==0){ans1+=2;ans2*=(cnt-1)*cnt/2;}else if(Cut==1){ans1+=1;ans2*=cnt;}}}printf("Case %lld: %lld %lld\n",Case,ans1,ans2);}
}

P3225-[HNOI2012]矿场搭建【tarjan,图论】相关推荐

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

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

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

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

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

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

  4. P3225 [HNOI2012]矿场搭建

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

  5. 洛谷 P3225 [HNOI2012]矿场搭建

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

  6. P3225 [HNOI2012] 矿场搭建

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

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

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

  8. Tarjan水题系列(2):HNOI2012 矿场搭建

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

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

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

  10. [HNOI2012]矿场搭建

    题解: 首先显然这是要缩点的 缩点双 直接对割点之间的联通块判断一下连着几个割点 连0个 cnt*(cnt-1)/2 连1个 cnt 连2个 0 代码: #include <bits/stdc+ ...

最新文章

  1. 收藏!PyTorch常用代码段合集
  2. 33、springboot整合springcloud
  3. java线性表_java实现线性表
  4. 重启asp.net 命令
  5. 2 自动递增_有石CAD自动下单,1天工作量1小时完成
  6. 写给即将离开校园准备进入 SAP 研究院实习的朋友
  7. 江西理工大学期末试卷c语言,2016年江西理工大学信息工程学院计算机应用技术(加试)之C语言程序设计复试笔试最后押题五套卷...
  8. Python Pandas –合并,联接和串联
  9. centos php编译,深入讲解CentOS PHP安装编译
  10. 冒险岛手游服务器维护界面,冒险岛手游游戏界面全解 丰富轻松画风
  11. matlab多元正态性检验,Matlab正态分布性检验
  12. 关于VMD相关介绍(二)
  13. xamp安装及环境配置教程
  14. 使用idea解决包依赖冲突的问题SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory
  15. pwm一个时间单位_「硬见小百科」什么是PWM“死区”?
  16. 《Mining Quality Phrases from Massive Text Corpora》论文学习笔记
  17. 骗你不是人 硬盘传输速度提升4倍的方法
  18. mysql 6安装当前密码_windows安装mysql数据库并修改密码
  19. POST,PUT和PATCH的区别
  20. shell之read用法

热门文章

  1. levedb 导入 mysql_LevelDB-初始篇
  2. mongodb时间范围查询少8个小时_为何要对开源mongodb数据库内核做二次开发
  3. 小学计算机课教学设计,小学信息技术教学设计三篇
  4. linux udp端口大数据包,Linux协议栈中UDP数据报从网卡到用户空间流程总结
  5. python网页动图_python,tensorflow线性回归Django网页显示Gif动态图
  6. php 清空一个数组_PHP工程师学Python数据类型
  7. git revert 后再次merge_git如何回滚错误合并的分支
  8. [Java基础]反射获取成员方法并使用
  9. C++用Prim算法实现无向图最小生成树
  10. Excel使用技巧,补充中。。。