BZOJ 2730 矿场搭建 Tarjan求割点
思路:
Tarjan求出来点双&割点 判一判就行了
//By SiriusRen
#include <stack>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define int long long
#define N 66666
#define mem(x,y) memset(x,y,sizeof(x))
stack<int>stk;
int first[666],next[N],v[N],rec[666][666],dfn[666],low[666],tot,all,cnt;
int xx,yy,root,n,m,Point[666],ans1,ans2,cases;
void add(int x,int y){v[tot]=y,next[tot]=first[x],first[x]=tot++;}
void tarjan(int x,int fa){
dfn[x]=low[x]=++cnt;int num=0;
for(int i=first[x];~i;i=next[i]){
if(i==fa)continue;
if(!dfn[v[i]]){
stk.push(i),tarjan(v[i],i^1);
low[x]=min(low[x],low[v[i]]);
if(dfn[x]<=low[v[i]]){
all++;num++,rec[all][++rec[all][0]]=x;
do{
xx=stk.top();stk.pop();
rec[all][++rec[all][0]]=v[xx];
}while(xx!=i);
}
}
else low[x]=min(low[x],dfn[v[i]]);
}
if(((x==root)&&num>=2)||(x!=root&&num))Point[x]=1;
}
signed main(){
while(~scanf("%lld",&m)&&m){
mem(first,-1),mem(Point,0),mem(dfn,0),ans1=n=all=tot=0,ans2=1;
for(int i=1;i<=m;i++){
scanf("%lld%lld",&xx,&yy);
add(xx,yy),add(yy,xx);
n=max(n,max(xx,yy)),rec[i<<1][0]=rec[(i<<1)-1][0]=0;
}
for(int i=1;i<=n;i++)
if(!dfn[i])root=i,tarjan(i,-1);
for(int i=1;i<=all;i++){
int num=0;
for(int j=1;j<=rec[i][0];j++)
if(Point[rec[i][j]])num++;
if(num==1)ans1++,ans2*=(rec[i][0]-1);
else if(!num){
if(rec[i][0]==1)ans1++;
else ans1+=2,ans2=ans2*rec[i][0]*(rec[i][0]-1)/2;
}
}
printf("Case %lld: %lld %lld\n",++cases,ans1,ans2);
}
}
BZOJ 2730 矿场搭建 Tarjan求割点的更多相关文章
- bzoj 2730: [HNOI2012]矿场搭建——tarjan求点双
Description 煤矿工地可以看成是由隧道连接挖煤点组成的无向图.为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处.于是矿主决定在某些挖煤点设立救援出口,使得无论哪一 ...
- [BZOJ2730][HNOI2012]矿场搭建(求割点)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2730 分析: 如果坍塌的点不是割点,那没什么影响,主要考虑坍塌的点是割点的情况. 显然 ...
- BZOJ 2730 矿场搭建
割点 割点以外的点坍塌不影响其他人逃生,因为假设我们任取两个个非割点s建立救援站,非割点的任意点坍塌,我们都可以从割点走到一个救援出口. 所以我们只考虑割点坍塌的情况. 我们可以先找出图中所有的割点. ...
- bzoj 1123 [POI2008]BLO Tarjan求割点
[POI2008]BLO Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1540 Solved: 711[Submit][Status][Discu ...
- [POJ1144][BZOJ2730]tarjan求割点
求割点 一种显然的n^2做法: 枚举每个点,去掉该点连出的边,然后判断整个图是否联通 用tarjan求割点: 分情况讨论 如果是root的话,其为割点当且仅当下方有两棵及以上的子树 其他情况 设当前节 ...
- UESTC 900 方老师炸弹 --Tarjan求割点及删点后连通分量数
Tarjan算法. 1.若u为根,且度大于1,则为割点 2.若u不为根,如果low[v]>=dfn[u],则u为割点(出现重边时可能导致等号,要判重边) 3.若low[v]>dfn[u], ...
- POJ 1144 Network(Tarjan求割点)
Network Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 12707 Accepted: 5835 Descript ...
- poj 1523 SPF(tarjan求割点)
本文出自 http://blog.csdn.net/shuangde800 ------------------------------------------------------------ ...
- poj_1144Network(tarjan求割点)
poj_1144Network(tarjan求割点) 标签: tarjan 割点割边模板 题目链接 Network Time Limit: 1000MS Memory Limit: 10000K To ...
随机推荐
- * ? 【a-z】【0-9】通配符 学习
通配符顾名思义就是通用的匹配信息的符号,比如星号(*)就是代表匹配零个或多个字符,问号(?)是代表匹配单个字符,中括号内加上数字[0-9]代表匹配单个阿拉伯数字的字符,而中括号内加上字母[abc]则是 ...
- HDU 4945 2048 DP 组合
思路: 这个题写了一个背包的解法,超时了.搜了下题解才发现我根本不会做. 思路参见这个: 其实我们可以这样来考虑,求补集,用全集减掉不能组成2048的集合就是答案了. 因为只要达到2048就可以了,所 ...
- Qt之QCryptographicHash
简述 QCryptographicHash类提供了生成密码散列的方法.该类可以用于生成二进制或文本数据的加密散列值.目前支持MD4.MD5.SHA-1.SHA-224.SHA-256.SHA-384和 ...
- js绑定事件方法:addEventListener与attachEvent的不同浏览器的兼容性写法
js的事件绑定方法中,ie仅仅支持attachEvent,而FF和Chrome仅仅支持addEventListener,所以就必须为这两个方法做兼容处理,原理是先推断attachEvent仅仅否为真( ...
- android之软件键盘
不弹出软件键盘 <activity android:name="PresCompleteActivity" android:windowSoftIn ...
- 版本控制器:SVN(精讲)
版本控制器:SVN 1 开发中的实际问题 1.1 小明负责的模块就要完成了,就在即将Release之前的一瞬间,电脑突然蓝屏,硬盘光荣牺牲!几个月来的努力付之东流——需求之一:备份! 1.2 这个项目 ...
- 《剑指offer》合并两个排序的链表
一.题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 二.输入描述 两个递增排序的链表 三.输出描述 合并成一个递增排序的链表 四.牛客网提供的框 ...
- 515Nod 1126 求递推序列的第n项【矩阵快速幂】
有一个序列是这样定义的:f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7. 给出A,B和N,求f(n)的值. Input 输 ...
- 添加本地 yum源
添加本地 yum源 yum-updatesd.conf yum的主配置文件 [root@zhou ~]# cd /etc/yum.repos.d/ [root@zhou yum.repos.d]# ...
- 四 numpy操作数组输出图片
一.读取一张图片,修改颜色通道后输出 # -*- coding=GBK -*- import cv2 as cv import numpy as np #numpy数组操作 def access_pi ...