Uva-1220 Party at Hali-Bula
2015-09-07 22:45
253 查看
题目链接:Party at Hali-Bula
题目大意:给一棵树,父节点和其子结点不能同时染色,问最多可以选取多少个结点染色,如果解唯一则输出Yes否则输出No。
解题思路:树形DP,dp[i][0]表示标号为i的节点不染色的最大选取值,dp[i][1]则是染色时的情况。更新的时候再判断一下唯一性:
1.dp[v][0] == dp[v][1]子节点是否染色都一样,则dp[u][0]不唯一。
2.子节点必须(不)染色,且此自最优解不唯一,则dp[u][0]不唯一。
代码如下:
题目大意:给一棵树,父节点和其子结点不能同时染色,问最多可以选取多少个结点染色,如果解唯一则输出Yes否则输出No。
解题思路:树形DP,dp[i][0]表示标号为i的节点不染色的最大选取值,dp[i][1]则是染色时的情况。更新的时候再判断一下唯一性:
1.dp[v][0] == dp[v][1]子节点是否染色都一样,则dp[u][0]不唯一。
2.子节点必须(不)染色,且此自最优解不唯一,则dp[u][0]不唯一。
代码如下:
#include <map> #include <set> #include <cmath> #include <queue> #include <stack> #include <cstdio> #include <cstdlib> #include <cstring> #include <iomanip> #include <iostream> #include <algorithm> using namespace std; typedef long long ll; typedef pair<int, int> P; const int inf = 0x3f3f3f3f; const int maxn = 2e4 + 15; bool Yuitsu, foo[205][2]; int n, dp[205][2]; vector<int> chd[205]; map<string, int> ha; void DFS(int u){ if(dp[u][0] != -1 && dp[u][0] != -1) return; if(!chd[u].size()){ dp[u][0] = 0; dp[u][1] = 1; return; } dp[u][1] = 1; dp[u][0] = 0; for(int i = 0; i < chd[u].size(); i++){ int v = chd[u][i]; DFS(v); dp[u][1] += dp[v][0]; if(foo[v][0]) foo[u][1] = true; dp[u][0] += max(dp[v][0], dp[v][1]); if(dp[v][0] == dp[v][1]) foo[u][0] = true; if(dp[v][0] > dp[v][1] && foo[v][0]) foo[u][0] = true; if(dp[v][1] > dp[v][0] && foo[v][1]) foo[u][0] = true; } return; } int main(){ #ifdef NEKO freopen("Nya.txt", "r", stdin); #endif ios::sync_with_stdio(false); cin.tie(0); string l, r; while(cin >> n && n){ for(int i = 0; i <= n; i++) chd[i].clear(); memset(dp, -1, sizeof dp); ha.clear(); memset(foo, false, sizeof foo); cin >> l; ha[l] = 0; Yuitsu = true; for(int i = 1; i < n; i++){ cin >> l >> r; if(!ha.count(l)) ha.insert({ l, ha.size() }); if(!ha.count(r)) ha.insert({ r, ha.size() }); chd[ha[r]].push_back(ha[l]); } DFS(0); if(dp[0][1] == dp[0][0]) Yuitsu = false; if(dp[0][1] > dp[0][0] && foo[0][1]) Yuitsu = false; if(dp[0][1] < dp[0][0] && foo[0][0]) Yuitsu = false; int ans = max(dp[0][1], dp[0][0]); cout << ans << ' ' << (Yuitsu == true ? "Yes" : "No") << endl; } return 0; }
相关文章推荐
- 测试基础
- C#面向对象三大特性
- HDU 1030 Delta-wave(找规律)
- JS 面向对象随笔
- uva 11090 - Going in Cycle!!(二分+BellmanFord)
- 二叉树的多种遍历——Java
- Oracle遇到的一些问题
- plsql使用
- 使用StringBuilder或StringBuffer代替string
- https://readthedocs.org/
- Vim的IDE配置(详细教程)
- Android异步更新UI的四种方式
- 指针函数与函数指针的区别
- 一部想感动人的科幻机器护驾片——看《终结者创世纪》
- [Flux] 3. Actions
- java.lang.UnsupportedClassVersionError: Bad version number in .class file
- Linux计划任务
- 用两个栈实现队列
- H3CNE 用户访问控制列表实现包过滤
- Python打开文件时的几种模式比较