Light OJ 1201 A Perfecr Murder (简单树形DP)

来源:互联网 发布:淘宝新开店铺骗局 编辑:程序博客网 时间:2024/06/05 14:29

解析:设dp[i][0]为在i的子树中,不谋杀i的最大人数。

dp[i][1]为在i的子树中,谋杀i的最大人数。

然后转移状态就好。。水题一个。

[code]:

#include<cstdio>#include<cstring>#include<cmath>#include<cstdlib>#include<algorithm>using namespace std;typedef long long LL;const int maxn = 1005;struct Nod{    int b,next;    void init(int b,int next){        this->b=b;this->next=next;    }}buf[10*maxn];int n,m,len,E[maxn],col[maxn],dp[maxn][2];void init(){    len = 0;    memset(E,-1,sizeof(E));    memset(col,0,sizeof(col));}void addEdge(int a,int b){    buf[len].init(b,E[a]);E[a]=len++;    buf[len].init(a,E[b]);E[b]=len++;}void dfs(int u,int pre){    int i,v;    dp[u][0] = 0;dp[u][1] = 1;    col[u] = 1;    for(i = E[u];i != -1;i = buf[i].next){        v = buf[i].b;        if(col[v]) continue;        dfs(v,u);        dp[u][0] += max(dp[v][0],dp[v][1]);        dp[u][1] += dp[v][0];    }}int main(){    int i,j,cas,T,u,v;    scanf("%d",&cas);    for(T = 1;T <= cas;T++){        scanf("%d%d",&n,&m);        init();        while(m--){            scanf("%d%d",&u,&v);            addEdge(u,v);        }        int ans = 0;        for(i = 1;i <= n;i++){            if(!col[i]){                dfs(i,-1);                ans += max(dp[i][0],dp[i][1]);            }        }        printf("Case %d: %d\n",T,ans);    }    return 0;}


0 0
原创粉丝点击