好久没写树型dp了...以前都是先找到叶子节点.用队列维护来做的...这次学着vector动态数组+DFS回朔的方法..感觉思路更加的清晰...

关于题目的第一问...能邀请到的最多人数..so easy了...很基础的树形DP..dp[k][0]表示以k为根的子树不选k点时的最大人数...dp[k][1]代表选k点时的....

关键是题目要求判断是否最优解唯一...首先如果状态a可以转移到状态b并且状态a达到最优方案的方式不唯一....那么转移得到的b最优方案的方式也必然不唯一...那么可以用一个布尔型数组uni[k][tp] ( k代表哪个点,tp=0或者1..和dp里的意思一样...)来记录当前状态最优解是否唯一..转移的时候跟着转移...

如此一来..只要找到源头就可以了..设点p以及其父亲节点f

因为 dp[f][0] = dp[f][0] + max( dp[p][0] , dp[p][1] ) 并且f点若不使用,就不会再影响到更上层的点...所以若dp[p][0]==dp[p][1]..说明uni[f][0]=false..不唯一...

但是还要注意..最后的结果若dp[root][0]==dp[root][1]...就算uni[root][0]=true,unit[root][1]=true..方案也是不唯一的...这个很显然...

Program:

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<set>
#include<ctime>
#include<algorithm>
#include<queue>
#include<cmath>
#include<map>
#define oo 1000000007
#define ll long long
#define pi acos(-1.0)
#define MAXN 205
using namespace std;
map<string,int> mymap;
vector<int> Tree[MAXN];
int n,dp[MAXN][2];
bool uni[205][2];
int ReadStringToInt(int &num)
{
char str[105];
string s;
scanf("%s",str),s=str;
if (!mymap.count(s)) mymap[s]=++num;
return mymap[s];
}
void dfs(int x)
{
int i,m=Tree[x].size();
dp[x][0]=0,dp[x][1]=1;
for (i=0;i<m;i++)
{
int p=Tree[x][i];
dfs(p);
if (dp[p][1] || dp[p][0])
{
if (dp[p][1]>dp[p][0])
{
dp[x][0]+=dp[p][1];
if (!uni[p][1]) uni[x][0]=false;
}else
if (dp[p][0]>dp[p][1])
{
dp[x][0]+=dp[p][0];
if (!uni[p][0]) uni[x][0]=false;
}else
dp[x][0]+=dp[p][0],uni[x][0]=false;
}
if (dp[p][0])
{
dp[x][1]+=dp[p][0];
if (!uni[p][0]) uni[x][1]=false;
}
}
return;
}
int main()
{
while (~scanf("%d",&n))
{
int i,num;
if (!n) break;
for (i=1;i<=n;i++) Tree[i].clear();
mymap.clear();
num=0;
ReadStringToInt(num);
for (i=1;i<n;i++)
{
int ep,boss;
ep=ReadStringToInt(num);
boss=ReadStringToInt(num);
Tree[boss].push_back(ep);
}
memset(uni,true,sizeof(uni));
dfs(1);
printf("%d ",max(dp[1][0],dp[1][1]));
bool f=true;
if (dp[1][0]==dp[1][1]) f=false;
else
if (dp[1][0]>dp[1][1]) f=uni[1][0];
else f=uni[1][1];
if (f) printf("Yes\n");
else printf("No\n");
}
return 0;
}

POJ 3342 - Party at Hali-Bula 树型DP+最优解唯一性判断的更多相关文章

  1. POJ 3342 Party at Hali-Bula ——(树型DP)

    一开始用pii保存dp类型,写的很长,还是WA了= =.. 然后参考了一下别人的博客,重新写了一发(似乎是岐哥的博客233). 代码如下: #include <stdio.h> #incl ...

  2. 【POJ 3140】 Contestants Division(树型dp)

    id=3140">[POJ 3140] Contestants Division(树型dp) Time Limit: 2000MS   Memory Limit: 65536K Tot ...

  3. 【POJ 2486】 Apple Tree(树型dp)

    [POJ 2486] Apple Tree(树型dp) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8981   Acce ...

  4. HDU_1520_Anniversary party_树型dp

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 Anniversary party Time Limit: 2000/1000 MS (Java ...

  5. POJ3659 Cell Phone Network(树上最小支配集:树型DP)

    题目求一棵树的最小支配数. 支配集,即把图的点分成两个集合,所有非支配集内的点都和支配集内的某一点相邻. 听说即使是二分图,最小支配集的求解也是还没多项式算法的.而树上求最小支配集树型DP就OK了. ...

  6. 【XSY1905】【XSY2761】新访问计划 二分 树型DP

    题目描述 给你一棵树,你要从\(1\)号点出发,经过这棵树的每条边至少一次,最后回到\(1\)号点,经过一条边要花费\(w_i\)的时间. 你还可以乘车,从一个点取另一个点,需要花费\(c\)的时间. ...

  7. 洛谷P3354 Riv河流 [IOI2005] 树型dp

    正解:树型dp 解题报告: 传送门! 简要题意:有棵树,每个节点有个权值w,要求选k个节点,最大化∑dis*w,其中如果某个节点到根的路径上选了别的节点,dis指的是到达那个节点的距离 首先这个一看就 ...

  8. Codeforces 581F Zublicanes and Mumocrates(树型DP)

    题目链接  Round 322 Problem F 题意  给定一棵树,保证叶子结点个数为$2$(也就是度数为$1$的结点),现在要把所有的点染色(黑或白) 要求一半叶子结点的颜色为白,一半叶子结点的 ...

  9. ZOJ 3949 (17th 浙大校赛 B题,树型DP)

    题目链接  The 17th Zhejiang University Programming Contest Problem B 题意  给定一棵树,现在要加一条连接$1$(根结点)和$x$的边,求加 ...

随机推荐

  1. 经验总结35--IP地址区域匹配

    想知道客服端訪问的IP地址是多少,并知道区域. 一般能够去http://www.ip138.com/,输入IP查询,但没提供比較好的接口,程序使用不方便. 另外有些企业提供一些离线的IP数据库,能够进 ...

  2. Web API-路由(二)

    路由匹配主要有三个阶段: 1.将URI匹配到一个路由模版: 2.选择一个controller 3.选择一个action: 可以使用系统提供的拓展点,修改默认的匹配与选择逻辑规则.   路由模版: 路由 ...

  3. 在windows下用C语言写socket通讯实例

    原文:在windows下用C语言写socket通讯实例 From:Microsoft Dev Center #undef UNICODE #define WIN32_LEAN_AND_MEAN #in ...

  4. 如何让Gridview在没有数据的时候显示表头(asp.net)

    原文:如何让Gridview在没有数据的时候显示表头(asp.net) 1.前言 当对GridView控件进行数据绑定时,如果绑定的记录为空,网页上就不显示GridView,造成页面部分空白,页面布局 ...

  5. jrtplib的使用

    JRTPLIB库的使用 文档: http://research.edm.uhasselt.be/jori/jrtplib/documentation/index.html 一些介绍: http://d ...

  6. 快速构建Windows 8风格应用28-临时应用数据

    原文:快速构建Windows 8风格应用28-临时应用数据 本篇博文主要介绍临时应用数据概览.如何构建临时应用数据. 一.临时应用数据概览 临时应用数据相当于网页中缓存,这些数据文件是不能够漫游的,并 ...

  7. Zend Server更新至6.2版本——虚拟主机全方位管理

    Zend Server自从发布6.0以来,并支持云服务,成为很多PHP程序所选择的Web服务器. Zend Server 6.2版本从更新内容来看,解决了Web服务器与虚拟主机之间的协同管理.并在细节 ...

  8. 扩展ToolBarManager、ListView和Grid控件以实现气球式的ToolTip

    原文:扩展ToolBarManager.ListView和Grid控件以实现气球式的ToolTip infragistics是全球领先的UI工具和用户体验的专家,Infragistics开发了一系列的 ...

  9. Web面试之JQuery

    程序员Web面试之JQuery   又到了一年一度的毕业季了,青春散场,却等待下一场开幕. 在求职大军中,IT行业的程序员.码农是工科类大学生的热门选择之一, 尤其是近几年Web的如火如荼,更是吸引了 ...

  10. Go语言搭建自己的博客

    我是如何用Go语言搭建自己的博客的   前言: 话说,已经很久没有在博客园更新博客了,之前写的关于go语言的系列学习文章<让我们一起Go>也由于种种原因一度中断.但是,正如我之前在文章中所 ...