标签:
生成树的上的一个非根结点对应一条生成树上的边,然后这个结点的子树上连出去的边就对应去掉这条边的割,
然后就可以对树外的边求LCA,在LCA上标记,利用这个信息可以算出有多少条边在子树上,以及有多少条边不再子树上。
其实更进一步,非叶子结点一定不会比叶子结点更优,连的边只不会减少。
所以只要统一叶子结点上的度数,然后枚举叶子结点。
#include<bits/stdc++.h> using namespace std; const int maxn = 2e4+5; int ct[maxn],dg[maxn]; int main() { //freopen("in.txt","r",stdin); int T; scanf("%d",&T); for(int kas = 1; kas <= T; kas++){ int n,m; scanf("%d%d",&n,&m); memset(ct+1,0,sizeof(int)*n); memset(dg+1,0,sizeof(int)*n); int u,v; for(int i = 1; i < n; i++){ scanf("%d%d",&u,&v); dg[u]++; dg[v]++; } for(int i = n; i <= m; i++){ scanf("%d%d",&u,&v); ct[u]++; ct[v]++; } int MinCut = 1<<30; for(int i = 1; i <= n; i++){ if(dg[i]<2){ MinCut = min(MinCut,ct[i]); } } printf("Case #%d: %d\n",kas,MinCut+1); } return 0; }
标签:
原文地址:http://www.cnblogs.com/jerryRey/p/4830413.html