站内题求助(玄关)
  • 板块学术版
  • 楼主Binah_cyc
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/5/3 21:41
  • 上次更新2024/5/4 08:46:44
查看原帖
站内题求助(玄关)
760171
Binah_cyc楼主2024/5/3 21:41

题目是U53878 【数据加强版】道路重建,调了半天A不了,谁能帮我看看

#include<bits/stdc++.h>
using namespace std;
//#define int long long
int n,m,ans=INT_MAX,a[100005],sze[100005];
int head[100005],tot;
struct Node
{
	int nxt,to;
} edge[100005];
void add(int x,int y)
{
	edge[++tot]=Node {head[x],y},head[x]=tot;
}
int dp[100000005];
void dfs1(int now)
{
	a[now]++;
	for(int i=head[now]; i; i=edge[i].nxt) dfs1(edge[i].to),a[now]+=a[edge[i].to];
	dp[now*m+a[now]]=1,dp[now*m]=0;
}
void dfs(int now)
{
	sze[now]=1;
	for(int i=head[now]; i; i=edge[i].nxt)
	{
		dfs(edge[i].to);
		for(int j=min(a[now]-1,sze[now]+sze[edge[i].to]); j; j--)
			for(int k=max(1,j-sze[now]); k<=j; k++)
				dp[now*m+j]=min(dp[now*m+j],dp[now*m+j-k]+dp[edge[i].to*m+k]);
		sze[now]+=sze[edge[i].to];
	}
	if(a[now]>=m) ans=min(ans,dp[now*m+a[now]-m]+dp[now*m+a[now]]);
}
signed main()
{
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	cin>>n>>m;
	for(int i=1,x,y; i<n; i++) cin>>x>>y,add(x,y);
	memset(dp,0x3f,sizeof(dp));
	dfs1(1);
	dp[1*m+a[1]]=0;
	dfs(1);
	cout<<ans;
	return 0;
}
2024/5/3 21:41
加载中...