题目大意:n个点n-1条边的一棵树,有m个点是超市;现在每个点到超市的最短距离都不超过D,至多删除多少条边,还能够保证每个点到超市的最短距离都不超过D?
预处理:超市点的数量是x,非超市点是y,x+y = n。
1、对于不是超市的点,都需要1条边来连向超市,所以至少需要y条边,至多删除n-1 - y条边。
2、要想删边后每个点到超市的距离不超过D,可以用y条边就够了。
超市不需要用边;非超市点,必有一条路连向超市,选距离最短的。不需要管怎么找到这条路,因为我们只需要知道是否可行就够。
#include <bits/stdc++.h> #define N 1000005 using namespace std; int n, m, i, j, k, ans, f[N]; int main(){ scanf("%d%d%*d", &n, &m); for(i=1; i<=m; i++){ scanf("%d", &k); if(++f[k] == 1) ans++; } printf("%d\n", (n-1)-(n-ans)); return 0; }