BZOJ 1596: [Usaco2008 Jan]电话网络 树形DP

博客提及有经典代码,强调在处理时需特别留意细节,但未给出更多具体信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

挺经典的,细节需要特别注意一下

Code: 

#include<bits/stdc++.h>  
using namespace std;  
#define setIO(s) freopen(s".in","r",stdin) 
#define maxn 20003 
#define inf 10000000
int edges; 
int hd[maxn],to[maxn],nex[maxn],f[maxn][4]; 
void add(int u,int v)
{
	nex[++edges]=hd[u],hd[u]=edges,to[edges]=v; 
} 
void dfs(int u,int fa)
{
	int sum=0; 
	f[u][0]=0, f[u][2]=1, f[u][1]=inf; 
	for(int i=hd[u];i;i=nex[i]) 
	{
		int v=to[i];  
		if(v==fa) continue; 
		dfs(v,u); 
		f[u][0]+=f[v][1], f[u][2]+=min(f[v][0],min(f[v][1], f[v][2])), sum+=min(f[v][1], f[v][2]); 
	} 
	for(int i=hd[u];i;i=nex[i]) 
	{
		int v=to[i]; 
		if(v==fa) continue; 
		f[u][1]=min(f[u][1], sum+f[v][2]-min(f[v][2],f[v][1]));          
	}             
} 
int main()
{
	//  setIO("input");  
	int i,j,n,x,y; 
	scanf("%d",&n); 
	for(i=1;i<n;++i) 
	{ 
		scanf("%d%d",&x,&y);  
		add(x,y), add(y,x); 
	} 
	dfs(1,0); 
	printf("%d\n",min(f[1][1],f[1][2])); 
	return 0; 
}

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值