E - Snowflake Tree

题目链接:https://atcoder.jp/contests/abc385/tasks/abc385_e

题意:

若规定两个数x,y

对于一个顶点来说其相邻点的个数为x,而其相邻点的相邻点的个数为y,则称这些节点组成的树为雪花树
现在给定一棵树,试求如何通过删除一些节点使留下的节点组成一颗雪花树并且删除的节点个数最少

思路:

观察发现,如果规定了雪花树的第一顶点和第二顶点的个数那么这颗雪花树就确定了

所以一定需要枚举第一顶点,对于第二顶点发现其第三顶点的个数取决于其最小值
不妨将其排序,从第三顶点个数最多的第二顶点出发,枚举得到tot的最大值

注意不能在主循环中dfs两下,这会导致tle:(

vector<int>e[maxn];
vector<int>deg;
int degree[maxn];
int cut=inf;

void solve(){
	int n;cin>>n;
	for(int i=1;i<=n-1;i++){
		int u,v;cin>>u>>v;
		e[u].pb(v);e[v].pb(u);
		degree[u]++;
		degree[v]++;
	}
	
	for(int i=1;i<=n;i++){
		deg.clear();
		for(int v:e[i])deg.pb(degree[v]-1);
		int tot=0;
		sort(deg.begin(),deg.end(),greater<int>());
		for(int j=0;j<deg.size();j++){
			int cnt=deg[j];
			tot=cnt*(j+1)+j+1+1;
			cut=min(cut,n-tot);
		}

	}
	cout<<cut<<endl;
}
posted @ 2025-03-27 21:18  Marinaco  阅读(15)  评论(0)    收藏  举报
//雪花飘落效果