UVA - 1220 Party at Hali-Bula 树的最大独立集
来源:互联网 发布:数据录入员是做什么的 编辑:程序博客网 时间:2024/05/17 04:12
题意: 给定n个人,存在上下级关系,每个人只有一个上级,求最大独立集。并判断最大独立集是否唯一
思路:d[i][0]表示以i为根的子树中,不选择第i个节点的最大独立集,f[i][0]表示以i为根的子树中,不选择第i个节点的方案是否唯一。同理,d[i][1]和f[i][1]就是选择第i个节点的情况。
状态转移:d[i][0] =∑max(d[v][0], d[v][1]), d[i][1] = ∑d[v][0];
唯一性的转移方程见代码:
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;}
如有不当之处欢迎指出!
0 0
- 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(树的最大独立集)
- UVA 1220 Party at Hali-Bula (树形dp--树的最大独立集)
- UVA - 1220 Party at Hali-Bula 树的最大独立集
- UVa - 1220 - Party at Hali-Bula ( 树形DP 求最大独立集 )
- POJ3342 Party at Hali-Bula(树的最大独立集-树形DP-刷表法)
- POJ 3342 Party at Hali-Bula (树形dp 树的最大独立集 判多解 好题)
- POJ 3342 Party at Hali-Bula(树的最大独立集)
- hdu Party at Hali-Bula 树形最大独立集 刷表递推解
- 100道动态规划——36 UVA 1220 Party at Hali-Bula 树形DP 最大独立集 思考欠妥
- Uva-1220-Party at Hali-Bula
- UVA 1220Party at Hali-Bula
- UVA - 1220 Party at Hali-Bula
- UVa 1220 Party at Hali-Bula
- Uva-1220 Party at Hali-Bula
- uva 1220 - Party at Hali-Bula
- Boostrap的栅格系统与自己额外定义的媒体查询的冲突
- 关于对new和delete的认识
- 订单统计
- 求网络号和子网掩码
- webservice使用JDK自带的jax-ws创建并发布一个简单的webservice
- UVA - 1220 Party at Hali-Bula 树的最大独立集
- 异常处理03
- 历届试题 分糖果(模拟)
- 奖学金
- dotnet new 命令使用模板生成Angular应用
- 修饰符小结12
- 【PHP】链式操作的实现
- go语言Arrays、Maps、Slices操作
- 【C语言简单说】十二:逻辑运算符&&