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\n",minn+1);
    }
    return 0;

}
View Code

 

posted @ 2019-08-29 11:31  starve_to_death  阅读(134)  评论(1编辑  收藏  举报