题目大意:给定一个图,前n-1条边为最小生成树的边,后m-n+1条边为图,求最少删除多少条边才能使原图不连通,其中最小生成树的边只能删除一条。
思路:将树上边的度和图上的度记录,只能删除树上度为一的边,在里面度数和最小的节点,最小值就是结果。
#include <bits/stdc++.h>
using namespace std;
#define mem(a) memset(a , 0 , sizeof(a))
int t1[20005] , t2[20005];
int visit[20005];
int main()
{
int t , n , m , k = 0;
scanf("%d" , &t);
while(t--)
{
mem(t1);
mem(t2);
mem(visit);
scanf("%d %d" , &n , &m);
int a , b;
for(int i = 0 ; i < n - 1; i ++)
{
scanf("%d %d" , &a , &b);
t1[a]++;
t1[b]++;
if(t1[a] > 1) visit[a] = 1;
if(t1[b] > 1) visit[b] = 1;
}
for(int i = 0 ; i < m - n + 1 ; i ++)
{
scanf("%d %d" , &a , &b);
t2[a]++;
t2[b]++;
}
int ans = 9999999;
for(int i = 1 ; i <= n ; i ++)
{
if(!visit[i])
{
if(t1[i] + t2[i] < ans) ans = t1[i] + t2[i];
}
}
printf("Case #%d: %d\n" , ++k , ans);
}
}