UVa 1220:Party at Hali-Bula(DP)
2015-09-17 23:01
387 查看
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=847&page=show_problem&problem=3661
题意:公司里有n(n≤200)(n \le 200)个人形成一个树形结构,即除了老板之外每个员工都有唯一的直属上司。要求选尽量多的人,但不能同时选择一个人和他的直属上司。问:最多能选多少人,以及在人数最多的前提下方案是否唯一。(本段摘自《算法竞赛入门经典(第2版)》
分析:
树的最大独立集问题,再加一个状态来表示答案是否唯一即可。
代码:
题意:公司里有n(n≤200)(n \le 200)个人形成一个树形结构,即除了老板之外每个员工都有唯一的直属上司。要求选尽量多的人,但不能同时选择一个人和他的直属上司。问:最多能选多少人,以及在人数最多的前提下方案是否唯一。(本段摘自《算法竞赛入门经典(第2版)》
分析:
树的最大独立集问题,再加一个状态来表示答案是否唯一即可。
代码:
#include <iostream> #include <algorithm> #include <fstream> #include <string> #include <cstring> #include <vector> #include <queue> #include <cmath> #include <cctype> #include <stack> #include <set> #include <map> using namespace std; const int maxn = 200 + 5, INF = 1e9; int n, id; string s1, s2; map< string, int > m; vector< int > sons[maxn]; int dp[maxn][maxn], f[maxn][maxn]; int DP(int u, int k) { if (dp[u][k] >= 0) return dp[u][k]; dp[u][k] = k; f[u][k] = 1; for (int i = 0; i < sons[u].size(); ++i) { int v = sons[u][i]; if (k) { dp[u][1] += DP(v, 0); if (!f[v][0]) f[u][1] = 0; } else { dp[u][0] += max(DP(v, 0), DP(v, 1)); if (dp[v][0] == dp[v][1]) f[u][0] = 0; else if (dp[v][0] > dp[v][1] && !f[v][0]) f[u][0] = 0; else if (dp[v][0] < dp[v][1] && !f[v][1]) f[u][0] = 0; } } return dp[u][k]; } int main() { while (~scanf("%d", &n), n) { memset(dp, -1, sizeof(dp)); memset(f, 0, sizeof(f)); for (int i = 0; i < n; ++i) sons[i].clear(); m.clear(); id = 0; cin >> s1; m[s1] = id++; for (int i = 0; i < n - 1; ++i) { cin >> s1 >> s2; if (m.find(s1) == m.end()) m[s1] = id++; if (m.find(s2) == m.end()) m[s2] = id++; sons[m[s2]].push_back(m[s1]); } DP(0, 0); DP(0, 1); if (dp[0][0] == dp[0][1]) printf("%d No\n", dp[0][0]); else if (dp[0][0] > dp[0][1]) printf("%d %s\n", dp[0][0], f[0][0] ? "Yes" : "No"); else printf("%d %s\n", dp[0][1], f[0][1] ? "Yes" : "No"); } return 0; }
相关文章推荐
- android fix project properties是什么意思
- CSS——样式表;选择器;优先级
- maven sts中1.7问题
- 快速排序的基本思想及Java实现
- Kurento应用开发指南(以Kurento 6.0为模板) 之六:kurento架构
- matlab突然无法打开.m文件 ??? Error using ==> feature Too many input arguments.
- Mac 下配置Tomcat环境
- win7 使用Notepad++文本编辑器编辑python
- sax基于注解生成站点地图
- 数据挖掘:基于朴素贝叶斯分类算法的文本分类实践
- 数据挖掘:基于朴素贝叶斯分类算法的文本分类实践
- hdu 5119 dp
- openstack 之 ceilometer: Sample
- oracle数据库中视图、索引、序列的相关概念
- html常用标签(form标签)
- java集合框架之List
- 利用锁机制解决商品表和库存表并发问题
- 将字符串中的字符'*'移到串的前部分,保证非*字符的顺序位置不能变
- opencv Mat 与IplImage 转换
- 从捋清想法到变成文字中间有多远?