poj 1848 树形dp

思路:表示我很弱,这个想不出dp方程,参考网上代码

#include<iostream>

#include<algorithm>

#include<cstring>

#include<cstdio>

#include<algorithm>

#include<vector>

#define inf 1<<20

#define Maxn 110

using namespace std;

int dp[Maxn][5],vi[Maxn];

vector<int> head[Maxn];

void init()

{

    memset(dp,0,sizeof(dp));

    memset(vi,0,sizeof(vi));

    for(int i=0;i<=100;i++)

        head[i].clear();

}

void dfs(int u)

{

    int i,v,sz;

    vi[u]=1;

    sz=head[u].size();

    int min1,min2,min3,sum;

    min1=min2=min3=inf;

    sum=0;

    for(i=0;i<sz;i++)

    {

        v=head[u][i];

        if(vi[v]) continue;

        dfs(v);

        sum+=dp[v][0];

        int temp=min(dp[v][1],dp[v][2])-dp[v][0];

        if(temp<min1)

        {

            min2=min1;

            min1=temp;

        }else if(temp<min2){

            min2=temp;

        }

        min3=min(min3,dp[v][2]-dp[v][0]);

    }

    dp[u][0]=1+sum+min(min1+min2,min3);

    dp[u][1]=sum;

    dp[u][2]=sum+min1;

}

int main()

{

    int n,i,j,a,b;

    while(scanf("%d",&n)!=EOF)

    {

        init();

        for(i=1;i<n;i++){

            scanf("%d%d",&a,&b);

            head[a].push_back(b);

            head[b].push_back(a);

        }

        dfs(1);

        if(dp[1][0]>=inf) printf("-1\n");

        else printf("%d\n",dp[1][0]);

    }

    return 0;

}

 

你可能感兴趣的:(poj)