程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> poj3342 Party at Hali-Bula

poj3342 Party at Hali-Bula

編輯:C++入門知識

[cpp]
/*
用dp[i][1]表示選擇結點i時以i為跟結點的子樹能得到的最大值,dp[i][0]為不選i時的最大值,
則dp[i][0]+=max(dp[j][0],dp[j][1]),dp[i][1]+=sum{dp[j][0]},其中j為i的兒子;
邊界為d[k][1]=1,d[k][0]=0(k為葉子節點)
本題比較難一點的是判斷解得唯一性。我的判斷方法是:如果dp[i][0]>=dp[i][1],
且dp[j][0]==dp[j][1](j為i的孩子),就可以判定為不唯一了。
對於根結點 如果dp[0][1]==dp[0][0] 可知不唯一;
*/ 
#include<iostream> 
#include<cstdio> 
#include<cstring> 
#include<vector> 
#include<algorithm> 
#define MAXSIZE 1000 
#define sf scanf 
#define pf printf 
#define __int64 long long 
#define INF 0xfffffff 
using namespace std; 
struct node 

    int v,next; 
}edge[MAXSIZE*4]; 
int head[MAXSIZE],ant,dp[MAXSIZE][2]; 
char s[250][20]; 
void add(int u,int v) 

    edge[ant].v=v; 
    edge[ant].next=head[u]; 
    head[u]=ant++; 

void DFS(int r,int f) 

    dp[r][1]=1; 
    dp[r][0]=0; 
    for(int i=head[r];i!=-1;i=edge[i].next) 
    { 
        int v=edge[i].v; 
        if(v==f) continue; 
        DFS(v,r); 
        dp[r][0]+=max(dp[v][0],dp[v][1]); 
        dp[r][1]+=dp[v][0]; 
    } 

bool cheak(int n) 

    for(int i=0;i<n;i++) 
    { 
        if(dp[i][0]>=dp[i][1]) 
        { 
            for(int j=head[i];j!=-1;j=edge[j].next) 
            { 
                int v=edge[j].v; 
                if(i==v) continue; 
                if(dp[v][0]==dp[v][1]) return false; 
            } 
        } 
    } 
    return true; 

int main() 

    int n,sum; 
    while(sf("%d",&n),n) 
    { 
        ant=0; 
        sum=1; 
        memset(dp,0,sizeof(dp)); 
        memset(head,-1,sizeof(head)); 
        char a[20],b[20]; 
        scanf("%s",s[0]); 
        int u,v; 
        for(int i=1;i<n;i++) 
        { 
            u=v=-1; 
            scanf("%s%s",&a,&b); 
            for(int i=0;i<sum;i++) 
            { 
                if(strcmp(a,s[i])==0) {u=i;} 
                if(strcmp(b,s[i])==0) {v=i;} 
            } 
            if(u==-1) {u=sum;strcpy(s[sum++],a);} 
            if(v==-1) {v=sum;strcpy(s[sum++],b);} 
            //cout<<u<<" "<<v<<endl; 
            add(u,v); 
            add(v,u); 
        } 
        DFS(0,-1); 
 
        int worth=max(dp[0][0],dp[0][1]); 
        bool flag=cheak(sum); 
        if(dp[0][0]==dp[0][1]) flag=false; 
        cout<<worth<<" "; 
        if(flag) cout<<"Yes"<<endl; 
        else cout<<"No"<<endl; 
    } 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved