求助
查看原帖
求助
556362
qwq___qaq楼主2021/10/15 18:38

WA 了,大概是用 ansans 数组记录剩余联通数,如果 1\le 1 就便历。

#include<bits/stdc++.h>
using namespace std;
const int maxn=4e5+5;
bool vis[maxn];
int t,n,k,sum,ans[maxn];
vector<int> G[maxn];
void cl(vector<int> &k){
	vector<int> t;
	swap(k,t);
}
void dfs(int i,int w){
	if(vis[i]||w==k+1)
		return;
	sum--;
	vis[i]=1;
	for(int j=0,l=G[i].size();j<l;j++){
		int c=ans[G[i][j]];
		if(c<=1)
			dfs(G[i][j],w+1);
		ans[G[i][j]]--;
	}
	return;
}
int main(){
	scanf("%d",&t);
	while(t--){
		scanf("%d%d",&n,&k);
		sum=n;
		for(int i=1;i<=n;i++){
			cl(G[i]);
			vis[i]=ans[i]=0;
		}
		for(int i=1,u,v;i<n;i++){
			scanf("%d%d",&u,&v);
			G[u].push_back(v);
			G[v].push_back(u);
		}
		for(int i=1;i<=n;i++){
			ans[i]=G[i].size();
			if(ans[i]<=1)
				dfs(i,1);
		}
		printf("%d\n",sum);
	}
	return 0;
}
2021/10/15 18:38
加载中...