#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. HTML5学习指导路线

    HTML5是现在热门的技术,经过8年的艰苦努力,该标准规范终于制定完成,在这里为想要学习HTML5初级程序员详细划分一下学习内容和步骤,让大家清楚的知道HTML5需要学什么?能够快速掌握HTML5开发 ...

  2. 编译虚拟机jvm——openjdk的编译

    java只所以被推广,实际上很大原因是因为本身是跨平台的,很大作用是因为虚拟机的关系. 一般情况下开发人员不需要关注虚拟机内部实现就可以日常开发了,但是有时候涉及到性能的时候就需要了解虚拟机的实现机制 ...

  3. J Query库

    J Query库 J Query选择器:与CSS选择器完全一致 J Query语法: (1)美元符定义J Query (2)选择符查询和HTML元素 (3)J Query带action方法执行对元素带 ...

  4. mysql初体验

    1.mysql数据库: 数据库----文件夹 数据表----文件 数据数据行---文件中的一行数据2. 初始: show databases; 查看当前mysql都有那些数据库,也就是根目录有哪些文件 ...

  5. thinkphp 使用插件异步上传图片或者文件

    使用tp做一些上传的功能,的确挺方便.但是在一些特殊情况下无法单独的使用tp的上传功能, 或者需要做一些比较酷炫的上传效果,这里就需要用到框架了. 我在这里使用的是uploadify上传插件. 首先需 ...

  6. Python入门 - 时间处理

    本讲主要介绍python时间处理方式,比如获取当前的时间: import time ftime = time.strftime("%Y年%m月%d日%H点%M分%S秒", time ...

  7. python使用rsa库做公钥解密(网上别处找不到)

    使用RSA公钥解密,用openssl命令就是openssl rsautl -verify -in cipher_text -inkey public.pem -pubin -out clear_tex ...

  8. 自己动手编写IOC框架(一)

    博客创建了2年多了,一直没敢写点东西,怕技术不够误导了别人.2年多后的今天我已经很有信心能够为需要帮助的人做点微薄的贡献了.这是我第一次写博客,先自我介绍一下.本人网名泪滴,一个非常伤心的名字,生活中 ...

  9. React 页面间传值的个人总结

    react 组件之间传值的方案有很多,下面是我个人经验的总结 props 来传递值 传值方式: 通过props 获取值 通过props 提供的func去修改值 优点: 不需要任何第三方的组件,纯rea ...

  10. Oracle table names are case sensitive (normally all uppercase)

    oracle_fdw error desc: postgres=# select * from test; ERROR:  Oracle table "sangli"." ...