Minimum Cut(2015沈阳online)【贪心】
Minimum Cut[贪心]2015沈阳online
题意:割最少的边使得图不连通,并且割掉的边中有且仅有一条是生成树的边。
首先,我们选择一条树中的边进行切割,此时仅考虑树上的边集,有两种情况:1.树被分为两个结点数大于1的子树2.树被分为一个子树和一个单独结点。
如果选择第一种情况,那么还要割掉其中一颗子树中的结点所涉及到的所有非树中边,这种情况下,如果重新选择,选择子树上的一个叶子结点,那么只需要割掉叶子结点于该树所连的边和该结点涉及到的非树中边,所需要割的边数一定小于第一种情形。
代码如下:
1 #include<bits/stdc++.h> 2 3 using namespace std; 4 5 int main(){ 6 int t,n,m,a,b; 7 scanf("%d",&t); 8 for(int i=1;i<=t;i++){ 9 scanf("%d%d",&n,&m); 10 int td[20010]={0},gd[20010]={0}; 11 for(int i=1;i<n;i++){ 12 scanf("%d%d",&a,&b); 13 td[a]++; 14 td[b]++; 15 } 16 for(int i=1;i<=m-n+1;i++){ 17 scanf("%d%d",&a,&b); 18 gd[a]++; 19 gd[b]++; 20 } 21 int ans=99999999; 22 for(int i=1;i<=n;i++){ 23 if(td[i]==1) 24 ans=min(ans,1+gd[i]); 25 } 26 printf("Case #%d: %d\n",i,ans); 27 } 28 return 0; 29 }
不得不说,最近的几场训练赛中,我们普遍存在一个问题,就是过于相信榜,榜上较少人过的题,我们往往会觉得自己也肯定过不了,就直接看都不看跳过了,此外,我们也常常在一道题上吊死,常常卡题卡好几个小时还不肯放过,以后一定要及时开新题,充分开新题!
由于做过的树相关题目较少,看到树的题,我总是会下意识的逃避,以后要克服这种畏难情绪,多多刷题~
Ps:参考了这位巨巨的解析https://blog.csdn.net/wygdove/article/details/48625467
小熊猫发发发会勇往直前!