求助换根dp
  • 板块P1364 医院设置
  • 楼主Forose
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/4 21:44
  • 上次更新2024/10/5 08:53:46
查看原帖
求助换根dp
1219953
Forose楼主2024/10/4 21:44

全 WA 且样例不过代码:

#include<cstdio>
#define ll long long 
const int N=405;
int n,cnt,head[N];
ll siz[N],a[N],ans=1e18,dp[N],dep[N];
struct yeah{
	int to,nex;
}edge[N];
void add(int u,int v){
	cnt++;
	edge[cnt].to=v;
	edge[cnt].nex=head[u];
	head[u]=cnt; 
}
void dfs1(int u,int fa){
	siz[u]=a[u],dep[u]=dep[fa]+1;
	for(int i=head[u];i!=0;i=edge[i].nex){
		int v=edge[i].to;
		if(v==fa) continue;
		dfs1(v,u);
		siz[u]+=siz[v];
	}
}
void dfs2(int u,int fa){
	for(int i=head[u];i!=0;i=edge[i].nex){
		int v=edge[i].to;
		if(v==fa) continue;
		dp[v]=dp[u]+siz[1]-siz[v]*2;
		dfs2(v,u);
	}
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		int u,v;
		scanf("%d %d %d",&a[i],&u,&v);
		if(u!=0) add(i,u),add(u,i);
		if(v!=0) add(i,v),add(v,i);
	}
	dfs1(1,0);
	for(int i=1;i<=n;i++){
		dp[1]+=a[i]*dep[i];
	}
	dfs2(1,0);
	for(int i=1;i<=n;i++){
		if(dp[i]<ans) ans=dp[i];
	}
	printf("%lld",ans);
	return 0;
}

AC 代码:

#include<cstdio>
#define ll long long 
const int N=405;
int n,cnt,dep[N],head[N];
ll siz[N],a[N],ans=1e18,dp[N];
struct yeah{
	int to,nex;
}edge[N];
void add(int u,int v){
	cnt++;
	edge[cnt].to=v;
	edge[cnt].nex=head[u];
	head[u]=cnt; 
}
void dfs1(int u,int fa,int dep){
	siz[u]=a[u];
	for(int i=head[u];i!=0;i=edge[i].nex){
		int v=edge[i].to;
		if(v==fa) continue;
		dfs1(v,u,dep+1);
		siz[u]+=siz[v];
	}
	dp[1]+=a[u]*dep;
}
void dfs2(int u,int fa){
	for(int i=head[u];i!=0;i=edge[i].nex){
		int v=edge[i].to;
		if(v==fa) continue;
		dp[v]=dp[u]+siz[1]-siz[v]*2;
		dfs2(v,u);
	}
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		int u,v;
		scanf("%d %d %d",&a[i],&u,&v);
		if(u!=0) add(i,u),add(u,i);
		if(v!=0) add(i,v),add(v,i);
	}
	dfs1(1,0,0);
	dfs2(1,0);
	for(int i=1;i<=n;i++){
		if(dp[i]<ans) ans=dp[i];
	}
	printf("%lld",ans);
	return 0;
}

照着题解改的,没看出两份代码有什么区别

2024/10/4 21:44
加载中...