本文主要是介绍poj 3342Party at Hali-Bula,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
最大独立集问题,加上判断唯一性
入门经典例题,不多说了
/************************************************ 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;
}
这篇关于poj 3342Party at Hali-Bula的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!