刚才CF的E
  • 板块灌水区
  • 楼主MeowScore
  • 当前回复7
  • 已保存回复7
  • 发布时间2021/10/14 00:59
  • 上次更新2023/11/4 03:52:17
查看原帖
刚才CF的E
140360
MeowScore楼主2021/10/14 00:59

本蒟蒻刚刚打了CF div3,E 题的做法是,把叶子加到队列里,跑bfs,统计每个点距离最近的叶子的距离,然后去和操作次数比较,统计答案,结果T了

蒟蒻脑子晚上可能晕了,所以算法错了请和善指出qwq

如果算法没错有没有大佬帮看一下代码qwq

#include<bits/stdc++.h>
using namespace std;
int n,opt;
const int N=400010;
int h[N],nex[2*N],to[2*N],cnt;
void add(int x,int y){
	cnt++;
	nex[cnt]=h[x];
	to[cnt]=y;
	h[x]=cnt;
}
int deg[N];
int d[N];//距离最近的叶子 
int q[N*10];
int head;
int tail;
bool v[N];
void bfs(){
	while(head<=tail){
		int x=q[head];
		head++;
		for(int i=h[x];i;i=nex[i]){
			int y=to[i];
			if(v[y])
				continue;
			d[y]=d[x]+1;
			v[y]=1;
			tail++;
			q[tail]=y;
		}
	}
}
int main(){
	//freopen("E. Gardener and Tree.in","r",stdin);
	//freopen("E. Gardener and Tree.out","w",stdout); 
	int T;
	cin>>T;
	while(T--){
		scanf("%d%d",&n,&opt);
		memset(h,0,sizeof(h));
		memset(nex,0,sizeof(nex));
		memset(deg,0,sizeof(deg));
		memset(d,0x3f,sizeof(d));
		memset(v,0,sizeof(v));
		if(n==1){
			puts("0");
			continue;
		}
		cnt=1;
		for(int i=1;i<=n-1;i++){
			int x,y;
			scanf("%d%d",&x,&y);
			add(x,y);
			add(y,x);
			deg[x]++;
			deg[y]++;
		}
		head=1;
		tail=0;
		for(int i=1;i<=n;i++){
			if(deg[i]!=1)
				continue;
			d[i]=0;
			tail++;
			q[tail]=i;
			v[i]=1;
		}
		bfs();
		int ans=0;
		for(int i=1;i<=n;i++)
			if(d[i]>=opt)
				ans++;
		printf("%d\n",ans);
	}
	return 0;
}
















2021/10/14 00:59
加载中...