zoukankan      html  css  js  c++  java
  • hdu5452

    http://acm.hdu.edu.cn/showproblem.php?pid=5452

    题意:给个图T(图G的最小生成树),然后再给定图G的剩余边,问你从图T中当且割一条边的情况再割图G中不属于图T的边,使整个图(图G)不联通,求最小割;

    分析:1、只能并且要求割图T中的一条边,所以只能割叶子节点的边才是不会差的,因为非叶子节点一定连有多条边(根节点有可能只能一条边,但树的根是可以任意的,我们这里把节点度数为1的点当作叶子节点)

       2、因为图T是图G的最小生成树,所以由其性质得图T一定含有图G的所有顶点,而图G剩下的边肯定是在这颗树上某俩个节点进行连接(题目有保证剩下的边不会是生成树的边);

       3、由1、2得,我们把这个图割成不联通一定是把某个叶子借点孤立起来,如果不是这样的话,你必定要割掉生成树中的其他边才能使图不联通,但我们已经割了连叶子节点的边,所以是不符合题意的。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int M=2e4+4;
    const int inf =0x3f3f3f3f;
    int T[M],G[M];
    int main(){
        int t;
        scanf("%d",&t);
        for(int k=1;k<=t;k++){
            int n,m;
            scanf("%d%d",&n,&m);
            for(int i=0;i<=n;i++)
                T[i]=G[i]=0;
            for(int i=0;i<n;i++){
                int u,v;
                scanf("%d%d",&u,&v);
                T[u]++;
                T[v]++;
            }
            for(int i=n;i<m;i++){
                int u,v;
                scanf("%d%d",&u,&v);
                G[u]++;
                G[v]++;
            }
            int minn=inf;
            
            for(int i=1;i<=n;i++){
                if(T[i]<2)
                    minn=min(minn,G[i]);
            }
            printf("Case #%d: ",k);
            printf("%d
    ",minn+1);
        }
        return 0;
    
    }
    View Code
  • 相关阅读:
    OpenSSL EVP_Digest系列函数的一个样例
    简单的函数指针使用
    写入简单的日志log
    C实现日志等级控制
    散列表
    数据结构-链表
    关于线程的几个函数
    MySQL什么时候会使用内部临时表?
    linux如何处理多连接请求?
    Centos下搭建nginx反向代理
  • 原文地址:https://www.cnblogs.com/starve/p/11428740.html
Copyright © 2011-2022 走看看