• [BZOJ2730][HNOI2012]矿场搭建 点双 割点


    2730: [HNOI2012]矿场搭建

    Time Limit: 10 Sec  Memory Limit: 128 MB
    Submit: 2852  Solved: 1344
    [Submit][Status][Discuss]

    Description

    煤矿工地可以看成是由隧道连接挖煤点组成的无向图。为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处。于是矿主决定在某些挖煤点设立救援出口,使得无论哪一个挖煤点坍塌之后,其他挖煤点的工人都有一条道路通向救援出口。请写一个程序,用来计算至少需要设置几个救援出口,以及不同最少救援出口的设置方案总数。

    Input

    输入文件有若干组数据,每组数据的第一行是一个正整数 N(N≤500),表示工地的隧道数,接下来的 N 行每行是用空格隔开的两个整数 S 和 T,表示挖       S 与挖煤点 T 由隧道直接连接。输入数据以 0 结尾。

    Output

    输入文件中有多少组数据,输出文件 output.txt 中就有多少行。每行对应一组输入数据的 结果。其中第 i 行以 Case i: 开始(注意大小写,Case 与 i 之间有空格,i 与:之间无空格,: 之后有空格),其后是用空格隔开的两个正整数,第一个正整数表示对于第 i 组输入数据至少需 要设置几个救援出口,第二个正整数表示对于第 i 组输入数据不同最少救援出口的设置方案总数。输入数据保证答案小于 2^64。输出格式参照以下输入输出样例。

    Sample Input

    9
    1 3
    4 1
    3 5
    1 2
    2 6
    1 5
    6 3
    1 6
    3 2
    6
    1 2
    1 3
    2 4
    2 5
    3 6
    3 7
    0

    Sample Output

    Case 1: 2 4
    Case 2: 4 1

    HINT

    Case 1 的四组解分别是(2,4),(3,4),(4,5),(4,6);

    Case 2 的一组解为(4,5,6,7)。

    Source

    day1

     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdlib>
     4 #include<cstdio>
     5 #include<cmath>
     6 #include<algorithm>
     7 #include<vector>
     8 #define maxn 200000
     9 #define ll long long
    10 using namespace std;
    11 int read() {
    12     int x=0,f=1;char ch=getchar();
    13     for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1;
    14     for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
    15     return x*f;
    16 }
    17 int t;
    18 int n;
    19 struct data {
    20     int to,next;
    21 }e[maxn*2];
    22 int head[maxn],cnt;
    23 void add(int u,int v) {e[cnt].next=head[u];e[cnt].to=v;head[u]=cnt++;}
    24 int dfn[maxn],low[maxn],cut[maxn],sum,sta[maxn],top,root,bt;
    25 vector<int> q[maxn];
    26 void dfs(int x) {
    27     dfn[x]=low[x]=++sum;
    28     sta[++top]=x;
    29     int tmp=0;
    30     for(int i=head[x];i>=0;i=e[i].next) {
    31         int to=e[i].to;
    32         if(!dfn[to]) {
    33             tmp++;
    34             dfs(to);
    35             low[x]=min(low[x],low[to]);
    36             if((x==root&&tmp>1)||(x!=root&&dfn[x]<=low[to])) cut[x]=1;
    37             if(dfn[x]<=low[to]) {
    38                 bt++;
    39                 q[bt].clear();
    40                 do {
    41                     q[bt].push_back(sta[top--]);
    42                 }while(sta[top+1]!=to);
    43                 q[bt].push_back(x);
    44             }
    45         }
    46         else low[x]=min(low[x],dfn[to]);
    47     }
    48 }
    49 int main() {
    50     int hh=0;
    51     while(n=read()) {
    52         if(!n) exit(0);
    53         hh++;
    54         memset(head,-1,sizeof(head));cnt=0;
    55         memset(dfn,0,sizeof(dfn));
    56         memset(low,0,sizeof(low));
    57         memset(cut,0,sizeof(cut));
    58         top=0;sum=0;bt=0;
    59         int m=0;
    60         for(int i=1;i<=n;i++) {
    61             int s=read(),t=read();
    62             add(s,t);add(t,s);
    63             m=max(m,max(s,t));
    64         }
    65         for(int i=1;i<=m;i++) {
    66             if(!dfn[i]) {root=i;dfs(i);}
    67         }
    68         ll res=0,num=1;
    69         for(int i=1;i<=bt;i++) {
    70             int len=q[i].size(),tmp=0;
    71             for(int j=0;j<len;j++) if(cut[q[i][j]]) tmp++;
    72             if(tmp==0) res+=2,num=num*(len-1)*len/2;
    73             else if(tmp==1) res++,num=num*(len-1);
    74         }
    75         printf("Case %d: %lld %lld
    ",hh,res,num);
    76     }
    77 }
    View Code
  • 相关阅读:
    新手学习FFmpeg
    新手学习FFmpeg
    新手学习FFmpeg
    进阶计划
    面试题汇总
    grep命令
    Quartz教程三:Job与JobDetail介绍
    spring boot热部署
    Quartz学习——SSMM(Spring+SpringMVC+Mybatis+Mysql)和Quartz集成详解(四)
    SpringBoot集成篇(二) 异步调用Async
  • 原文地址:https://www.cnblogs.com/wls001/p/9341209.html
Copyright © 2020-2023  润新知