LOJ #10157. 「一本通 5.2 例 5」皇宫看守

可以先比较一下下面三个代码段有什么不同。
想错了。
void dfs(int u,int fa)
{
	f[u][1]=c[u];
	for (register int i=head[u]; i; i=e[i].next)
	if (e[i].to!=fa)
	{
		dfs(e[i].to,u);
		f[u][0]+=min(f[e[i].to][1],f[e[i].to][2]);
		f[u][1]+=min(f[e[i].to][0],min(f[e[i].to][1],f[e[i].to][2]));
		f[u][2]+=f[e[i].to][1];
	}
}

AC。
void dfs(int u,int fa)
{
	int more=2e9;
	f[u][1]=c[u];
	for (register int i=head[u]; i; i=e[i].next)
	if (e[i].to!=fa)
	{
		dfs(e[i].to,u);
		f[u][0]+=min(f[e[i].to][1],f[e[i].to][2]);
		f[u][1]+=min(f[e[i].to][0],min(f[e[i].to][1],f[e[i].to][2]));
		f[u][2]+=min(f[e[i].to][1],f[e[i].to][2]);
		if (f[e[i].to][1]<f[e[i].to][2]) more=0;
		else more=min(more,f[e[i].to][1]-f[e[i].to][2]);
	}
	f[u][2]+=more;
}
很明显,一个点可以由它的父亲,它自己和它儿子来看守,记录为f[i][0],f[i][1],f[i][2],那么f[i][0],f[i][1]的转移比较容易,一开始想f[i][2]的时候就感觉有点怪怪的,为什么f[i][2]直接加上f[j][1]呢?果然错了。用它儿子守护,不需要它全部的儿子都要选,只要至少一个儿子就行了。当然如果选儿子比选孙子划算那就选儿子喽,所以是至少。
所以f[i][2]更准确的意思是:至少让一个儿子看守的花费。
所以这时候f[i][2]+=min(f[j][1],f[j][2]),不过,如果所有的儿子都比孙子贵,也就是说我们选了一堆孙子,一个儿子也没选,所以需要记录一个孙子与儿子的最小差值,之后来补差值。当有一个儿子比孙子便宜的时候,那么差值就为0了,不然差值就为min(f[j][2]-f[j][1])。
#include <bits/stdc++.h>
using namespace std;
const int N=1505;
int n,w,x,u,v;
int c[N],f[N][3];
int cnt,head[N];
struct edge{int next,to;}e[N<<1];
inline void add(int u,int v)
{
	cnt++;
	e[cnt].next=head[u];
	e[cnt].to=v;
	head[u]=cnt;
}

void dfs(int u,int fa)
{
	int more=2e9;
	f[u][1]=c[u];
	for (register int i=head[u]; i; i=e[i].next)
	if (e[i].to!=fa)
	{
		dfs(e[i].to,u);
		f[u][0]+=min(f[e[i].to][1],f[e[i].to][2]);
		f[u][1]+=min(f[e[i].to][0],min(f[e[i].to][1],f[e[i].to][2]));
		f[u][2]+=min(f[e[i].to][1],f[e[i].to][2]);
		if (f[e[i].to][1]<f[e[i].to][2]) more=0;
		else more=min(more,f[e[i].to][1]-f[e[i].to][2]);
	}
	f[u][2]+=more;
}

int main(){
	scanf("%d",&n);
	for (register int i=1; i<=n; ++i)
	{
		scanf("%d%d%d",&u,&w,&x);
		c[u]=w;
		while (x--) scanf("%d",&v),add(u,v),add(v,u);	
	}
	dfs(1,0);
	printf("%d\n",min(f[1][1],f[1][2]));
return 0;
}
发布了64 篇原创文章 · 获赞 29 · 访问量 681

猜你喜欢

转载自blog.csdn.net/Dove_xyh/article/details/103860484
今日推荐