您的位置:首页 > 其它

UVA 1220 Party at Hali-Bula——dp

2018-03-13 19:51 429 查看
紫书P282讲得很明白#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <map>
using namespace std;
const int maxn = 500;
int n, tot = 0;
vector<int> G[maxn];
map<string, int> m;
bool judge[maxn][2];
int dp[maxn][2];
void dfs(int u) {
if (G[u].size() == 0) {
dp[u][0] = 0;
dp[u][1] = 1;
judge[u][0] = judge[u][1] = true;
return;
}
dp[u][1] = 1;
dp[u][0] = 0;
judge[u][1] = judge[u][0] = true;
for (int i = 0; i < G[u].size(); i++) {
int v = G[u][i];
dfs(v);
dp[u][1] += dp[v][0];
judge[u][1] &= judge[v][0];
if (dp[v][0] > dp[v][1]) {
dp[u][0] += dp[v][0];
judge[u][0] &= judge[v][0];
}
else if (dp[v][0] < dp[v][1]) {
dp[u][0] += dp[v][1];
judge[u][0] &= judge[v][1];
}
else {
dp[u][0] += dp[v][0];
judge[u][0] = false;
}
}
}
int main() {
//freopen("out.txt", "w", stdout);
while (~scanf("%d", &n) && n) {
for (int i = 1; i <= n; i++) G[i].clear();
m.clear();
tot = 0;
string s1, s2;
cin >> s1;
if (!m[s1]) m[s1] = ++tot;
for (int i = 1; i <= n - 1; i++) {
cin >> s1 >> s2;
if (!m[s1]) m[s1] = ++tot;
if (!m[s2]) m[s2] = ++tot;
G[m[s2]].push_back(m[s1]);
}
dfs(1);
bool res;
int ans;
if (dp[1][0] > dp[1][1]) ans = dp[1][0], res = judge[1][0];
else if (dp[1][0] < dp[1][1]) ans = dp[1][1], res = judge[1][1];
else ans = dp[1][0], res = false;
printf("%d ", ans);
if (res) printf("Yes\n");
else printf("No\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: