UVA - 1220 Party at Hali-Bula 树的最大独立集
2017-02-19 11:38
274 查看
题意: 给定n个人,存在上下级关系,每个人只有一个上级,求最大独立集。并判断最大独立集是否唯一
思路:d[i][0]表示以i为根的子树中,不选择第i个节点的最大独立集,f[i][0]表示[b]以i为根的子树中,不选择第i个节点的方案是否唯一。同理,d[i][1]和f[i][1]就是选择第i个节点的情况。[/b]
[b] 状态转移:d[i][0] =
∑max(d[v][0], d[v][1]), d[i][1] =
∑d[v][0];[/b]
[b] 唯一性的转移方程见代码:[/b]
if(k == 1) { //选择节点u
d[u][k] += dfs(v, 0); //不选择子节点
if(!f[v][0]) f[u][k] = 0;
}
else {
d[u][k] += max(dfs(v, 1), dfs(v, 0));
if(d[v][0] == d[v][1]) f[u][k] = 0;
else if(d[v][0] > d[v][1] && !f[v][0]) f[u][k] = 0;
else if(d[v][1] > d[v][0] && !f[v][1]) f[u][k] = 0;
}AC代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<utility>
#include<string>
#include<iostream>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<stack>
using namespace std;
#define eps 1e-10
#define inf 0x3f3f3f3f
#define PI pair<int, int>
const int maxn = 200 + 5;
map<string, int>name;
vector<int>son[maxn];
int cnt, d[maxn][2], f[maxn][2];
int getID(string &p) {
if(!name.count(p)) name[p] = cnt++;
return name[p];
}
int dfs(int u, int k) {
f[u][k] = 1;
d[u][k] = k;
int n = son[u].size();
for(int i = 0; i < n; ++i) {
int v = son[u][i];
if(k == 1) { //选择节点u
d[u][k] += dfs(v, 0); //不选择子节点
if(!f[v][0]) f[u][k] = 0;
}
else {
d[u][k] += max(dfs(v, 1), dfs(v, 0));
if(d[v][0] == d[v][1]) f[u][k] = 0;
else if(d[v][0] > d[v][1] && !f[v][0]) f[u][k] = 0;
else if(d[v][1] > d[v][0] && !f[v][1]) f[u][k] = 0;
}
}
return d[u][k];
}
int main() {
int n, root;
string boss, kid;
while(scanf("%d", &n) == 1 && n) {
for(int i = 0; i < n; ++i) son[i].clear();
name.clear();
cnt = 0;
cin >> boss;
getID(boss);
for(int i = 1; i < n; ++i) {
cin >> kid >> boss;
int par = getID(boss), kids = getID(kid);
son[par].push_back(kids);
}
int ans = max(dfs(0, 0), dfs(0, 1));
printf("%d ", ans);
int only = 1;
if(d[0][0] == d[0][1]) only = 0;
else if(d[0][0] > d[0][1] && !f[0][0]) only = 0;
else if(d[0][1] > d[0][0] && !f[0][1]) only = 0;
if(only) printf("Yes\n");
else printf("No\n");
}
return 0;
}
如有不当之处欢迎指出!
思路:d[i][0]表示以i为根的子树中,不选择第i个节点的最大独立集,f[i][0]表示[b]以i为根的子树中,不选择第i个节点的方案是否唯一。同理,d[i][1]和f[i][1]就是选择第i个节点的情况。[/b]
[b] 状态转移:d[i][0] =
∑max(d[v][0], d[v][1]), d[i][1] =
∑d[v][0];[/b]
[b] 唯一性的转移方程见代码:[/b]
if(k == 1) { //选择节点u
d[u][k] += dfs(v, 0); //不选择子节点
if(!f[v][0]) f[u][k] = 0;
}
else {
d[u][k] += max(dfs(v, 1), dfs(v, 0));
if(d[v][0] == d[v][1]) f[u][k] = 0;
else if(d[v][0] > d[v][1] && !f[v][0]) f[u][k] = 0;
else if(d[v][1] > d[v][0] && !f[v][1]) f[u][k] = 0;
}AC代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<utility>
#include<string>
#include<iostream>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<stack>
using namespace std;
#define eps 1e-10
#define inf 0x3f3f3f3f
#define PI pair<int, int>
const int maxn = 200 + 5;
map<string, int>name;
vector<int>son[maxn];
int cnt, d[maxn][2], f[maxn][2];
int getID(string &p) {
if(!name.count(p)) name[p] = cnt++;
return name[p];
}
int dfs(int u, int k) {
f[u][k] = 1;
d[u][k] = k;
int n = son[u].size();
for(int i = 0; i < n; ++i) {
int v = son[u][i];
if(k == 1) { //选择节点u
d[u][k] += dfs(v, 0); //不选择子节点
if(!f[v][0]) f[u][k] = 0;
}
else {
d[u][k] += max(dfs(v, 1), dfs(v, 0));
if(d[v][0] == d[v][1]) f[u][k] = 0;
else if(d[v][0] > d[v][1] && !f[v][0]) f[u][k] = 0;
else if(d[v][1] > d[v][0] && !f[v][1]) f[u][k] = 0;
}
}
return d[u][k];
}
int main() {
int n, root;
string boss, kid;
while(scanf("%d", &n) == 1 && n) {
for(int i = 0; i < n; ++i) son[i].clear();
name.clear();
cnt = 0;
cin >> boss;
getID(boss);
for(int i = 1; i < n; ++i) {
cin >> kid >> boss;
int par = getID(boss), kids = getID(kid);
son[par].push_back(kids);
}
int ans = max(dfs(0, 0), dfs(0, 1));
printf("%d ", ans);
int only = 1;
if(d[0][0] == d[0][1]) only = 0;
else if(d[0][0] > d[0][1] && !f[0][0]) only = 0;
else if(d[0][1] > d[0][0] && !f[0][1]) only = 0;
if(only) printf("Yes\n");
else printf("No\n");
}
return 0;
}
如有不当之处欢迎指出!
相关文章推荐
- UVa-1220 Party at Hali-Bula (最大独立集)
- UVa 1220 Party at Hali-Bula (树形DP,最大独立集)
- UVa - 1220 - Party at Hali-Bula ( 树形DP 求最大独立集 )
- 100道动态规划——36 UVA 1220 Party at Hali-Bula 树形DP 最大独立集 思考欠妥
- UVA 1220 Party at Hali-Bula (树形dp--树的最大独立集)
- UVA 1220 Party at Hali-Bula(树的最大独立集)
- Party at Hali-Bula(UVA - 1220) 树形dp 最大独立集
- UVa 1220 (树的最大独立集) Party at Hali-Bula
- UVA1220Party at Hali-Bula(树的最大独立集 + 唯一性判断)
- UVa 1220 - Party at Hali-Bula(最大独立集)
- UVA-1220 Party at Hali-Bula (树的最大独立集)
- UVA - 1220 ( Party at Hali-Bula)(树形dp—树的最大独立集+判断唯一性)
- UVa 1220 Party at Hali-Bula dp:树的最大独立集
- UVA 1220 Party at Hali-Bula (树形DP)
- Party at Hali-Bula UVA - 1220
- 【Uva 1220】Party at Hali-Bula
- UVa 1220 Hali-Bula的晚会(树的最大独立集)
- uva 1220 ,Patty at Hali-Bula 树形dp 树上最大独立集 并判断是否唯一
- hdu Party at Hali-Bula 树形最大独立集 刷表递推解
- UVA1220Party at Hali-Bula(树形dp)