思路:

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求割点的更多相关文章

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

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

  2. [BZOJ2730][HNOI2012]矿场搭建(求割点)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2730 分析: 如果坍塌的点不是割点,那没什么影响,主要考虑坍塌的点是割点的情况. 显然 ...

  3. BZOJ 2730 矿场搭建

    割点 割点以外的点坍塌不影响其他人逃生,因为假设我们任取两个个非割点s建立救援站,非割点的任意点坍塌,我们都可以从割点走到一个救援出口. 所以我们只考虑割点坍塌的情况. 我们可以先找出图中所有的割点. ...

  4. bzoj 1123 [POI2008]BLO Tarjan求割点

    [POI2008]BLO Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1540  Solved: 711[Submit][Status][Discu ...

  5. [POJ1144][BZOJ2730]tarjan求割点

    求割点 一种显然的n^2做法: 枚举每个点,去掉该点连出的边,然后判断整个图是否联通 用tarjan求割点: 分情况讨论 如果是root的话,其为割点当且仅当下方有两棵及以上的子树 其他情况 设当前节 ...

  6. UESTC 900 方老师炸弹 --Tarjan求割点及删点后连通分量数

    Tarjan算法. 1.若u为根,且度大于1,则为割点 2.若u不为根,如果low[v]>=dfn[u],则u为割点(出现重边时可能导致等号,要判重边) 3.若low[v]>dfn[u], ...

  7. POJ 1144 Network(Tarjan求割点)

    Network Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12707   Accepted: 5835 Descript ...

  8. poj 1523 SPF(tarjan求割点)

    本文出自   http://blog.csdn.net/shuangde800 ------------------------------------------------------------ ...

  9. poj_1144Network(tarjan求割点)

    poj_1144Network(tarjan求割点) 标签: tarjan 割点割边模板 题目链接 Network Time Limit: 1000MS Memory Limit: 10000K To ...

随机推荐

  1. redis.conf配置文件配置项解析

    知识来源于 : https://blog.csdn.net/bsfz_2018/article/details/79061413[Redis在linux下的安装] daemonize:如需要在后台运行 ...

  2. 基础命令:chown

    chown:改变文件或目录的用户和用户组 [语法格式] chown [option] [OWNER][:[GROUP]] [file] chown  [选项]  [用户 : 用户组 ]  [<文 ...

  3. python 面向对象 封装

    什么是封装 广义上的封装:代码的保护,面对对象的思想本身就是 只让自己的对象能调自己类的方法 狭义上的封装:将属性和方法藏起来 私有属性/私有方法 python没有真正意义的私有属性,可以通过调用实例 ...

  4. 紫书 例题8-9 UVa 1451 (数形结合)

    这道题用了数形结合, 真的牛逼, 完全想到不到还可以这么做 因为题目求的是平均值, 是总数除以个数, 这个时候就可以联系 到斜率, 也就是说转化为给你一堆点, 让你求两点之间的最大斜率 要做两个处理 ...

  5. 怎么给Unity写一个原生的插件

    本文章由cartzhang编写,转载请注明出处. 所有权利保留. 文章链接:http://blog.csdn.net/cartzhang/article/details/50266889 作者:car ...

  6. Windows下安装Linux虚拟机的用途和好处

    Windows一般是办公界面,主要做代码编辑查看,资料查找,还有发邮件,也可以用Windows下的其他的有用软件,Linux主要作为编译工具,基本上开发都是在Linux平台下编译,例如编译驱动就需要在 ...

  7. js时间格式化函数,支持Unix时间戳

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  8. Experience Design for Sexable Forum

    Mars March 16, 2015

  9. 教你怎样做个有“钱”途的測试project师

    百度百科说測试project师这一职业的待遇,薪酬上升空间很大.但測试project师也有自己的烦恼,比方在程序出错后,将问题反馈给程序猿,然后程序猿给的答复是:"oh,howisthatp ...

  10. MFC中CFileDialog使用方法

    用CFileDialog选择了一个文件后,使用FILE::fopen打开文件错误,使用 的是相对地址.和王工调试了半天,怎么跟踪也没发现错误,原来如此. .... .. . . CFileDialog ...