#include<iostream>
 #include<cstdio>
 #include<cstdlib>
 #include<cstring>
 #define maxn 4000
 using namespace std;
 struct hh
 {
     int to,nxt;
 }b[maxn];
 int head[maxn],dfn[maxn],low[maxn];
 ,df=,de,k=,z,gd;
 bool vis[maxn],g[maxn];
 void link(int x,int y)
 {
     b[++tot].nxt=head[x];
     b[tot].to=y;
     head[x]=tot;
 }
 void tarjan(int x,int rt,int fa)
 {
     dfn[x]=++df;low[x]=df;
     vis[x]=;
     for (int i=head[x];i;i=b[i].nxt)
     {
         int t=b[i].to;
         if (t==fa) continue;
         if (!dfn[t])
         {
             tarjan(t,rt,x);
             low[x]=min(low[x],low[t]);
             ;}
         }
         else if (vis[t]) low[x]=min(low[x],dfn[t]);
     }
 }
 void dfs(int x)
 {
     dfn[x]=k;
     if (g[x]) return ;
     z++;
     for (int i=head[x];i;i=b[i].nxt)
     {
         int t=b[i].to;
         if (g[t]&&dfn[t]!=k) gd++,dfn[t]=k;
         if (!dfn[t]) dfs(t);
     }
 }
 int main()
 {
     ;
     scanf ("%d",&n);
     )
     {
         memset(dfn,,sizeof(dfn));
         memset(b,,sizeof(b));
         memset(head,,sizeof(head));
         memset(low,,sizeof(low));
         memset(vis,,sizeof(vis));
         memset(g,,sizeof(g));
         tot=,df=,de=,k=,z=,gd=;
         ,l=;
         ;
         ;i<=n;++i)
         {
             int x,y;
             scanf ("%d%d",&x,&y);
             link(x,y),link(y,x);
             l=max(max(l,x),y);
         }
         ;i<=l;++i)
         {
             de=;
             );
             ) g[i]=;
         }
         memset(dfn,,sizeof(dfn));
         ;i<=l;++i)
         {
             if (!dfn[i]&&!g[i])
             {
                 k++;z=gd=;
                 dfs(i);
                 ,ans2*=(z-)*z/;
                 ) ans1++,ans2*=z;
             }
         }
         printf("Case %d: %d %lld\n",++cases,ans1,ans2);
         scanf ("%d",&n);
     }
 }

在求割点那里卡了一个多小时

因为之前都完全不知道还有根节点那边的判断啊啊啊TAT

看了好久那几句都没看懂(空想是没有用的啊少年!otz

实际上的话 画画图就差不多了 枚举多种情况

然后主要对每一块分三种情况讨论

有俩割点的时候随你怎么炸 反正炸了一个就跑另一边

有一个割点的话就设一个好了 然后那一个不要放在割点上

没有割点就很心塞了 乖乖设俩吧= =

方案的话就简单的乘一乘就好啦

HNOI 2012 矿场搭建的更多相关文章

  1. [BZOJ 2730][HNOI 2012] 矿场搭建

    2730: [HNOI2012]矿场搭建 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2113  Solved: 979[Submit][Statu ...

  2. 【BZOJ-2730】矿场搭建 Tarjan 双连通分量

    2730: [HNOI2012]矿场搭建 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1602  Solved: 751[Submit][Statu ...

  3. bzoj2730 [HNOI2012]矿场搭建 (UVAlive5135 Mining Your Own Business)

    2730: [HNOI2012]矿场搭建 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1147  Solved: 528[Submit][Statu ...

  4. BZOJ 2730: [HNOI2012]矿场搭建( tarjan )

    先tarjan求出割点.. 割点把图分成了几个双连通分量..只需dfs找出即可. 然后一个bcc有>2个割点, 那么这个bcc就不用建了, 因为一定可以走到其他救援出口. 只有一个割点的bcc就 ...

  5. bzoj2730(矿场搭建)

    矿场搭建,不知道为什么,莫名其妙T了在212上,额,zyh数据真的坑. bzoj200轻松跑过啊. 就是点双联通分量缩点,然后标记割点,一个块如果有>=2个割点,则不需要挖矿洞, 如果只有一割点 ...

  6. 【CJOJ P1333】【HNOI2012】矿场搭建

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

  7. 洛谷 P3225 [HNOI2012]矿场搭建 解题报告

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

  8. 【刷题】BZOJ 2730 [HNOI2012]矿场搭建

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

  9. 【BZOJ】2730: [HNOI2012]矿场搭建【Tarjan找割点】【分联通块割点个数】

    2730: [HNOI2012]矿场搭建 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 3230  Solved: 1540[Submit][Stat ...

随机推荐

  1. 十、VueJs 填坑日记之在项目中使用Amaze UI

    上一篇博文,我们把jQuery集成到了项目中,今天我们来集成Amaze ui(妹子UI).先来介绍一下妹子UI.Amaze UI 含近 20 个 CSS 组件.20 余 JS 组件,更有多个包含不同主 ...

  2. 一个简单的迷你jQuery实现

    //仅提供与学习使用(function () { var _$ = window.$; var _jQuery = window.jQuery; //暴露外部使用的一个接口 var jQuery = ...

  3. C语言之计算log2

    #include<stdio.h>int main(){int num,count=0,i=0,ret=0;scanf("%d",&num);count=num ...

  4. iOS11UINavigationBar的item左右间距调整

    相信很多同学都知道在iOS7之后调整导航栏两侧按钮距离左右间距,其实就是在左右barButtonItem的数组中添加一个宽度为负的占位item. - (void)addLeftBarButtonIte ...

  5. poj2524 解题报告

    基于并查集的一道简单题目 Ubiquitous Religions Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 22334 ...

  6. thinkphp中各字母代表的发放和具体实例

    hinkphp单字母函数使用指南A方法 A方法用于在内部实例化控制器,调用格式:A('[项目://][分组/]模块','控制器层名称') 最简单的用法: $User = A('User'); 复制代码 ...

  7. PF_RING install in centos7

    很多centos7是最小化安装. 这样很多kernel就没有安装全,而且很多开发库也没有. 在安装PF_RING过程中,会缺少很多依赖. 首先安装依赖包: yum -y install numactl ...

  8. 用 Label 控制 Service 的位置 - 每天5分钟玩转 Docker 容器技术(106)

    上一节我们讨论了 Service 部署的两种模式:global mode 和 replicated mode.无论采用 global mode 还是 replicated mode,副本运行在哪些节点 ...

  9. vs2015 制作安装包额外需要安装的软件VSI_bundle

    vs2015 制作安装包额外需要安装的软件VSI_bundle 下载地址:http://files.cnblogs.com/files/sdner/VSI_bundle.rar

  10. Python的控制语句

    1.  控制语句 控制语句是用来改变程序执行的顺序.程序利用控制语句有条件地执行语句,循环地执行语句或者跳转到程序中的其他部分执行语句. Python支持三种不同的控制语句:if,for和while, ...