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; }