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;
}
浙公网安备 33010602011771号