题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6228
思路:
只要一条边的左右部分都有大于等于k个点,这条边就可以作为一条公共的边;
一共有n-1条边和n个点,我们可以把对边的遍历转化为对当前顶点和下一个顶点的遍历;
代码如下:
#include<bits/stdc++.h> #include<vector> using namespace std; const int MAX = 200020; int num[MAX]; vector<int>v[MAX]; int ans, n, k; void DFS(int u) { num[u] = 1; for(int i = 0; i < v[u].size(); i++) { int p = v[u][i]; if(num[p]) continue; DFS(p); num[u] += num[p]; if(num[p] >= k && n - num[p] >= k) ans++; } } int main() { int t,a, b; scanf("%d", &t); while(t--) { ans = 0; memset(num, 0, sizeof(num)); scanf("%d %d", &n, &k); for(int i = 1; i <= n;i++) { v[i].clear(); } for(int i = 0; i < n-1; i++) { scanf("%d %d", &a, &b); v[a].push_back(b); v[b].push_back(a); } DFS(1); cout<<ans<<endl; } }