点双连通分量 [HNOI2012]矿场搭建
问题 F: [HNOI2012]矿场搭建
时间限制: 1 Sec 内存限制: 128 MB
题目描述
输入
输入文件有若干组数据,每组数据的第一行是一个正整数 N(N≤500),表示工地的隧道数,接下来的 N 行每行是用空格隔开的两个整数 S 和 T,表示挖 S 与挖煤点 T 由隧道直接连接。输入数据以 0 结尾。
输出
输入文件中有多少组数据,输出文件 output.txt 中就有多少行。每行对应一组输入数据的 结果。其中第 i 行以 Case i: 开始(注意大小写,Case 与 i 之间有空格,i 与:之间无空格,: 之后有空格),其后是用空格隔开的两个正整数,第一个正整数表示对于第 i 组输入数据至少需 要设置几个救援出口,第二个正整数表示对于第 i 组输入数据不同最少救援出口的设置方案总 数。输入数据保证答案小于 2^64。输出格式参照以下输入输出样例。
样例输入
9 1 3 4 13 51 22 61 56 31 63 26 1 21 32 42 53 63 70
样例输出
Case 1: 2 4Case 2: 4 1
提示
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#define N 500
#define ll long long
using namespace std;
struct node
{int v,next;
} lu[N*2+5];
int zhan[N*2+5];
int dfn[N*2+5],low[N*2+5],belong[N*2+5];
int n,m,adj[N*2+5],e,cnt,ji,head;
ll ans2=1,ans1=0;
void add(int u,int v){lu[++e].v=v;lu[e].next=adj[u];adj[u]=e;}
void init()
{memset(dfn,0,sizeof(dfn));memset(low,0,sizeof(low));memset(adj,0,sizeof(adj));memset(belong,0,sizeof(belong));head=e=ji=0;ans1=0;ans2=1;
}
void tarjin(int x)
{dfn[x]=low[x]=++ji;for(int i=adj[x];i;i=lu[i].next){int to=lu[i].v;if(dfn[to])low[x]=min(low[x],dfn[to]);else{tarjin(to);low[x]=min(low[x],low[to]);if(low[to]>=dfn[x])belong[x]++;}}
}
void dfs(int x)
{low[x]=dfn[x]=++ji;zhan[++head]=x;for(int i=adj[x];i;i=lu[i].next){int to=lu[i].v;if(dfn[to])low[x]=min(low[x],dfn[to]);else{dfs(to);low[x]=min(low[x],low[to]);if(low[to]>=dfn[x]){int t,temp=0,size=0;while(1){t=zhan[head--];if(belong[t]>=2)temp++;size++;if(t==to)break;}t=x;if(belong[t]>=2)temp++;++size;if(!temp)ans1+=2,ans2*=size*(size-1)/2;else if(temp==1)ans1++,ans2*=size-1;}}}
}
int yjn()
{
// freopen("bzoj_2730.in","r",stdin);
// freopen("bzoj_2730.out","w",stdout);int u=0;while(++u){scanf("%d",&m);if(m==0)break;init();int x,y;for(int i=1;i<=m;i++){scanf("%d%d",&x,&y);add(x,y);add(y,x);n=max(n,max(x,y));}for(int i=1;i<=n;i++)if(!dfn[i])tarjin(i);elsebelong[i]++;memset(dfn,0,sizeof(dfn));ji=0;for(int i=1;i<=n;i++)if(!dfn[i])dfs(i);cout<<"Case "<<u<<": "; cout<<ans1<<' '<<ans2<<endl; }
}
int qty=yjn();
int main(){;}
点双连通分量 [HNOI2012]矿场搭建相关推荐
- 洛谷——P3225 [HNOI2012]矿场搭建
P3225 [HNOI2012]矿场搭建 题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤 ...
- 【bzoj2730】 HNOI2012—矿场搭建
http://www.lydsy.com/JudgeOnline/problem.php?id=2730 (题目链接) 题意 给出一张图,问如果删掉其中一个点,使得其他每个节点都有一个安全撤离的出口, ...
- P3225 [HNOI2012] 矿场搭建
题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一个挖煤点坍塌之 ...
- bzoj 2730: [HNOI2012]矿场搭建——tarjan求点双
Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一 ...
- P3225 [HNOI2012]矿场搭建 割点 tarjan 双联通分量
https://www.luogu.org/problemnew/show/P3225 题意 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一 ...
- Tarjan水题系列(2):HNOI2012 矿场搭建
题目: 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一个挖煤点坍塌之后 ...
- [HNOI2012]矿场搭建
题解: 首先显然这是要缩点的 缩点双 直接对割点之间的联通块判断一下连着几个割点 连0个 cnt*(cnt-1)/2 连1个 cnt 连2个 0 代码: #include <bits/stdc+ ...
- 洛谷 P3225 [HNOI2012]矿场搭建
题目描述 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一个挖煤点坍塌之 ...
- [BZOJ2730][HNOI2012]矿场搭建(求割点)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2730 分析: 如果坍塌的点不是割点,那没什么影响,主要考虑坍塌的点是割点的情况. 显然 ...
最新文章
- 硕士生两年发14篇论文!获浙大最高层次奖学金!
- android studio 跳转后保留原页面数据_Intent详解以及Activity的跳转与数据传递
- 阿里为啥放弃Oracle、Hadoop,选择全面拥抱它!网友:断臂求生?
- linux 天堂测试软件,[Ubuntu] HTTP Live Streaming 安装测试
- ES业界优秀实践案例汇总
- BZOJ5020: [THUWC 2017]在美妙的数学王国中畅游
- 2.7 HBase架构深入剖析
- windows操作系统中配置java环境
- ajax如何解决浏览器缓存问题
- 中国男人何时回归家庭?(转)
- SAP Spartacus基于travis的持续集成
- 使用可视化工具redisclient连接redis
- C++里将string类字符串(utf-8编码)分解成单个字(可中英混输)
- 爬虫:验证码识别准确率(Tesseract-OCR)
- mysql数据库表字段使用DESC等关键字报错及解决方法
- UML类图关系全面剖析[转]
- centos下yum安装wget失败
- mac os 使用记录
- 【经典算法题】排列序列
- C++ limits头文件的用法(numeric_limits)