uva 1220 - Party at Hali-Bula

来源:互联网 发布:java最简单小游戏程序 编辑:程序博客网 时间:2024/05/19 08:02
//uva  1220 - Party at Hali-Bula/* 赤裸裸的树的最大独立集 对于以i为根的子树,其最大独立集为 d[i]. 则有 d[i] = max(sum(d[j]),sum(d[k]) +1 ) . 其中d[j]表示 d[i]的儿子节点最大独立集.d[k]表示d[i]的孙子节点的最大独立集。 在这里我们可以使用递归的方法来求得这个d数组。使用flag标记当取得最优值的时是那种情况。  */#include <iostream>#include <queue>#include <stack>#include <stdio.h>#include <stdlib.h>#include <math.h>#include<vector>#include <string.h>#include <algorithm>#include <set>#include <map>#include <cstdio>#define ll long longusing namespace std ;const int maxn = 210 ;vector<int> son[maxn] ;int flag[maxn];int d[maxn] ;int dp(int u ){    if (d[u]!=-1) {        return d[u] ;    }    if (!son[u].size()) {        flag[u]=0 ;       return  d[u] = 1 ;    }    else{        int len  = (int)son[u].size() ;        int ans1 =0,ans2 = 0 ;        for (int i = 0; i < len; i++) {            int v = son[u][i] ;            ans1 += dp(v) ;            int len1 = (int)son[v].size() ;            for (int j = 0 ; j < len1; j++) {                ans2+= dp(son[v][j]) ;            }        }        ans2+=1 ;        if (ans2 == ans1) {            flag[u] = 1 ;            return  d[u] = ans1  ;        }        else{            if (ans1 > ans2) {                flag[u] = 2 ;                d[u] = ans1 ;            }            else{               flag[u] = 3 ;                d[u] = ans2 ;            }            return d[u] ;        }    }}bool isOnlyOne(int u){    if (flag[u]==1 ) {        return true ;    }    else if(flag[u]==2){        int len = (int)son[u].size() ;        for (int i = 0; i < len; i++) {            if (isOnlyOne(son[u][i])) {                return true ;            }        }    }    else if(flag[u] == 3  ){        int len = (int)son[u].size() ;        for (int i = 0; i < len; i++) {            int v = son[u][i] ;            int len2 = (int)son[v].size()  ;            for (int j = 0 ; j < len2; j++) {                if (isOnlyOne(son[v][j])) {                    return true ;                }            }        }    }    else{        return false ;    }    return false ;}map<string , int > name ;int main() {    int n  ;    string str,str1 ;    int  t = 0 ;    while (scanf("%d" , &n),n) {        t = 0 ;        cin>>str ;        name.clear() ;        name[str] = 0 ;t++ ;        for (int i = 0; i <n+1; i++) {            son[i].clear()  ;        }        int b ,sub ;        for (int i = 0; i < n -1; i++) {            cin >>str>>str1 ;            if (name.count(str)) {                b =  name[str] ;            }            else            {                b = t++ ;name[str] = b  ;            }            if (name.count(str1)) {                sub =  name[str1] ;            }else            {                sub = t++ ;name[str1] = sub  ;            }            son[sub].push_back(b)   ;        }        memset(flag, 0, sizeof(flag)) ;        memset(d, -1, sizeof(d)) ;        cout<<dp(0) ;        if (isOnlyOne(0)) {            cout<<' '<<"No" ;        }        else{            cout << ' ' <<"Yes";        }        cout << endl ;    }        return 0;}

0 0
原创粉丝点击