poj 3659

有意思的树形dp

代码:

#include<iostream>
#include<fstream>

using namespace std;

int n;
struct e{
	int data;
	e *next;
};

e edge[10001];
int dp[10001][3];
int v[10001];

void solve(int s){
	int i,j,k;
	v[s]=1;
	e *p=edge[s].next;
	dp[s][1]=1;
	dp[s][0]=0;
	dp[s][2]=10000000;
	if(!p) return;
	k=-1000000;
	int f=0;
	dp[s][2]=0;
	while(p)
	{
		if(v[p->data]==0)
		{
			solve(p->data);
			dp[s][1]+=min(dp[p->data][0],dp[p->data][1]);
			if(dp[p->data][2]>=dp[p->data][1])
			{
				f=1;
			}
			dp[s][2]+=min(dp[p->data][2],dp[p->data][1]);
			dp[s][0]+=min(dp[p->data][2],dp[p->data][1]);
			if(k<dp[p->data][2]-dp[p->data][1])
				k=dp[p->data][2]-dp[p->data][1];
		}
		p=p->next;
	}
	if(f==0)
		dp[s][2]-=k;
}

void read(){
//	ifstream cin("in.txt");
	int i,j,k,s,t;
	cin>>n;
	for(i=1;i<n;i++)
	{
		cin>>s>>t;
		e*p=new e;
		p->data=s;
		p->next=edge[t].next;
		edge[t].next=p;

		e *q=new e;
		q->data=t;
		q->next=edge[s].next;
		edge[s].next=q;
	}
	solve(1);
	cout<<min(dp[1][2],dp[1][1])<<endl;
}

int main(){
	read();
	return 0;
}

posted on 2011-05-10 14:24  宇宙吾心  阅读(421)  评论(0)    收藏  举报

导航