您的位置:首页 > 其它

poj 3342Party at Hali-Bula

2015-02-25 14:12 357 查看
最大独立集问题,加上判断唯一性

入门经典例题,不多说了

/***********************************************
 * Author: fisty
 * Created Time: 2015/2/25 13:07:12
 * File Name   : uva1220.cpp
 *********************************************** */
#include <iostream>
#include <cstring>
#include <deque>
#include <cmath>
#include <queue>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <string>
#include <vector>
#include <cstdio>
#include <bitset>
#include <algorithm>
using namespace std;
#define Debug(x) cout << #x << " " << x <<endl
#define Memset(x, a) memset(x, a, sizeof(x))
const int INF = 0x3f3f3f3f;
typedef long long LL;
typedef pair<int, int> P;
#define FOR(i, a, b) for(int i = a;i < b; i++)
#define MAX_N 210
int n;
int dp[MAX_N][2];
int f[MAX_N][2];
int tot;
map<string, int> mp;
vector<int> G[MAX_N];

void dfs(int u){
    for(int i = 0;i < G[u].size(); i++){
        int v = G[u][i];
        dfs(v);
        // u不选
        dp[u][0] += max(dp[v][1], dp[v][0]);
        if(dp[v][0] == dp[v][1]) f[u][0] = 0;
        else if(dp[v][1] > dp[v][0] && !f[v][1]) f[u][0] = 0;
        else{
            if(dp[v][0] > dp[v][1] && !f[v][0]) f[u][0] = 0;
        }
        // u选
        dp[u][1] += dp[v][0];
        if(f[v][0] == 0) f[u][1] = 0;
    }
}
void init(){
    tot = 0;
    mp.clear();
    Memset(dp, 0);
    Memset(G, 0);
    FOR(i, 0, n+1){
        dp[i][1] = 1;
        f[i][1] = f[i][0] = 1;
    }
}   
int main() {
    //freopen("in.cpp", "r", stdin);
    cin.tie(0);
    ios::sync_with_stdio(false);
    while(cin >> n){ 
        if(!n) break;
        init();
        string boos;
        cin >> boos;
        mp[boos] = ++tot;
        for(int i = 1;i < n; i++){
            string employee;
            cin >> employee >> boos;
            if(!mp[employee]) mp[employee] = ++tot;
            if(!mp[boos]) mp[boos] = ++tot;
            G[mp[boos]].push_back(mp[employee]);
        }
        dfs(1);
        if(dp[1][0] > dp[1][1]){
            cout << dp[1][0] << " ";
            if(f[1][0] == 1)  cout << "Yes" << endl;
            else cout << "No" << endl;
        }else if(dp[1][0] == dp[1][1]){
            cout << dp[1][0] << " ";
            cout << "No" << endl;
        }else{
            cout << dp[1][1] << " ";
            if(f[1][1] == 1) cout << "Yes" << endl;
            else cout << "No" << endl;
        }
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: