POJ_3342_Party at Hali-Bula_树形DP
POJ_3342_Party at Hali-Bula_树形DP
题意:直接上司和本人不能同时参加,求最多参加人数,并回答是否唯一解。
分析:常规树形DP,需要再维护一下选/不选当前点取得最大值时是否为唯一解。
就是在转移时判断该状态是从哪转移过来的,最后答案同理。
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 220
#define mem(x) memset(x,0,sizeof(x))
int head[N],to[N<<1],nxt[N<<1],flg,cnt,n;
int f[N],g[N],h[N],d[N];
char ch[N][N],a[N],b[N];
void add(int u,int v)
{
to[++cnt]=v;
nxt[cnt]=head[u];
head[u]=cnt;
}
void dfs(int x,int y)
{
f[x]=1;d[x]=h[x]=1;
for(int i=head[x];i;i=nxt[i])
{
if(to[i]!=y)
{
dfs(to[i],x);
f[x]+=g[to[i]];
g[x]+=max(g[to[i]],f[to[i]]);
if(g[to[i]]>f[to[i]]&&d[to[i]]==0)d[x]=0;
else if(g[to[i]]<f[to[i]]&&h[to[i]]==0)d[x]=0;
else if(g[to[i]]==f[to[i]])d[x]=0;
if(d[to[i]]==0)h[x]=0;
}
}
}
int main()
{
while(scanf("%d",&n))
{
if(!n)break;
mem(d);mem(h);mem(f);mem(g);mem(head);
cnt=0;flg=0;
scanf("%s",ch[1]);
int now=1;
for(int i=1;i<n;i++)
{
scanf("%s%s",a,b);
int na=0,nb=0;
for(int j=1;j<=now;j++)
{
if(strcmp(ch[j],a)==0)
{
na=j;
}
if(strcmp(ch[j],b)==0)
{
nb=j;
}
}
if(!na)
{
na=++now;
strcpy(ch[now],a);
}
if(!nb)
{
nb=++now;
strcpy(ch[now],b);
}
add(na,nb);
add(nb,na);
}
dfs(1,0);
printf("%d ",max(f[1],g[1]));
if(f[1]==g[1])flg=1;
if(f[1]>g[1]&&h[1]==0)flg=1;
if(f[1]<g[1]&&d[1]==0)flg=1;
puts(flg?"No":"Yes");
}
}
POJ_3342_Party at Hali-Bula_树形DP的更多相关文章
- 树形DP 复习
树形DP 树形DP:建立在树上的动态规划 一般有两种传递方式:根→叶或叶→根 前者出现在换根DP中,一般操作是求出某一个点的最优解,再通过这一个点推知其他点的最优解. 后者是树形DP的常见形式,一般树 ...
- poj3417 LCA + 树形dp
Network Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4478 Accepted: 1292 Descripti ...
- COGS 2532. [HZOI 2016]树之美 树形dp
可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...
- 【BZOJ-4726】Sabota? 树形DP
4726: [POI2017]Sabota? Time Limit: 20 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 128 Solved ...
- 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)
题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...
- 树形DP
切题ing!!!!! HDU 2196 Anniversary party 经典树形DP,以前写的太搓了,终于学会简单写法了.... #include <iostream> #inclu ...
- BZOJ 2286 消耗战 (虚树+树形DP)
给出一个n节点的无向树,每条边都有一个边权,给出m个询问,每个询问询问ki个点,问切掉一些边后使得这些顶点无法与顶点1连接.最少的边权和是多少.(n<=250000,sigma(ki)<= ...
- POJ2342 树形dp
原题:http://poj.org/problem?id=2342 树形dp入门题. 我们让dp[i][0]表示第i个人不去,dp[i][1]表示第i个人去 ,根据题意我们可以很容易的得到如下递推公式 ...
- hdu1561 The more, The Better (树形dp+背包)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1561 思路:树形dp+01背包 //看注释可以懂 用vector建树更简单. 代码: #i ...
随机推荐
- DDD中直接引用和ID关联的关系
聚合根到聚合根:通过ID关联: 聚合根到其内部的实体,直接引用: 聚合根到值对象,直接引用: 实体到聚合根: 通过ID关联 : 实体到其聚合的聚合根:1对1ID关联,1对多可直接引用 : 实体到其聚合 ...
- java并发包分析之———ConcurrentSkipListMap
一.前言 concurrentHashMap与ConcurrentSkipListMap性能测试 在4线程1.6万数据的条件下,ConcurrentHashMap 存取速度是ConcurrentSki ...
- access登录窗口校验代码一
Private Sub login_Click()If IsNull(Me.username) ThenMsgBox "请输入用户名!", vbExclamationElseIf ...
- C++内存分区
C++的内存划分为栈区.堆区.全局区/静态区.字符串常量和代码区. 这里去掉自由存储区,增加了代码区,理由会在下面讲到. 栈区:由系统进行内存的管理. 说明:主要存放函数的参数以及局部变量.栈区由系统 ...
- SQL Server 表的管理_关于完整性约束的详解(案例代码)
SQL Server 表的管理之_关于完整性约束的详解 一.概述: ●约束是SQL Server提供的自动保持数据库完整性的一种方法, 它通过限制字段中数据.记录中数据和表之间的数据来保证数据的完整性 ...
- php插入mysql中文数据出现乱码
$con = mysqli_connect(DB_HOST, DB_USER, DB_PWD, $dbname) or die('数据库连接失败'); mysqli_set_charset($con, ...
- php实现点击文字提交表单并传递数据至下一个页面
<?php $id="4";//等会要把这个数据传到第二个页面 ?> <?php echo "<li>"; echo " ...
- LCA最近公共祖先(倍增版)
倍增版LCA lac即最近公共祖先,u和v最近公共祖先就是两节点公用的祖先中深度最大的 比如 其中 lca(1,2)=4, lca(2,3)=4, lca(3,5)=1, lca(2,5)=4; 如何 ...
- git命令行常用几个指令(细节问题)
GIT PUSH/PULL时总需要输入用户名密码的解决方案: git config --global credential.helper store 查看当前的配置信息: git config --s ...
- SpringCloud实战-Eureka
熟悉微服务架构或Dubbo框架的都知道,微服务中最核心.最基础的组件就是注册中心了.下面利用Spring Cloud Eureka实现服务注册中心.并注册一个简单的服务提供者. 首先先创建一个spir ...