【Link】:https://cn.vjudge.net/contest/170078#problem/M

【Description】



求一个树的最大独立子集;

(即树的一个点集,这个点集中任意两个点,都不相连)

然后,问你这个点集是不是唯一的;

【Solution】



设d[i][0],f[i][0],表示以i为根节点的子树在i节点不选的时候的最大独立子集,f[i][0],表示在不选i的时候,这个最大独立子集是否唯一;

d[i][1],f[i][1]的定义类似,只不过变成了i这个点不选;

对于第i个节点要选的情况;

儿子节点只能都不选

d[i][0]=∑d[j][1]

(j为i的儿子,当f[j][1]全部为true,f[i][0]才为true)

对于第i个节点不选的情况

儿子节点可选、可不选

d[i][1]=∑max(d[j][0],d[j][1])

这里,如果d[j][0]==d[j][1],或者d[j][0]和d[j][1]中那个较大值的f值为false;

则f[i][1]为false;否则为true;

最后,在根节点1上面加一个0节点

直接输出d[0][1];

->因为0节点不选的话,对应1节点可选可不选;

然后根据f[0][1]判断YES和NO;



【NumberOf WA】



1



【Reviw】



d[y][0]写成了dy[0]…

然后dy是那个模板里的四个方向数组….



【Code】

#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ms(x,y) memset(x,y,sizeof x)
#define Open() freopen("F:\\rush.txt","r",stdin)
#define Close() ios::sync_with_stdio(0) typedef pair<int,int> pii;
typedef pair<LL,LL> pll; const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int N = 210; int n,cnt;
string boss;
map <string,int> dic;
vector <int> g[N];
int d[N][2];
bool f[N][2]; void dfs(int x){
d[x][0] = 1,f[x][0] = true;
d[x][1] = 0,f[x][1] = true;
int len = g[x].size();
rep1(i,0,len-1){
int y = g[x][i];
dfs(y);
d[x][0]+=d[y][1],f[x][0] = f[x][0] && f[y][1];
if (d[y][0]==d[y][1]) f[x][1] = false,d[x][1] += d[y][1];
if (d[y][0] > d[y][1]){
d[x][1] += d[y][0];
if (!f[y][0]) f[x][1] = false;
}
if (d[y][0] < d[y][1]){
d[x][1] += d[y][1];
if (!f[y][1]) f[x][1] = false;
}
}
} int main(){
//Open();
Close();
while (cin >> n && n){
rep1(i,0,n) g[i].clear();
cnt = 0;
dic.clear();
cin >> boss;
dic[boss] = ++cnt;
string x,y;
rep1(i,1,n-1){
cin >> x >> y;
if (dic[x]==0) dic[x]=++cnt;
if (dic[y]==0) dic[y]=++cnt;
int xx = dic[x],yy = dic[y];
g[yy].pb(xx);
}
g[0].pb(1);
dfs(0);
cout << d[0][1] <<' ';
if (f[0][1])
cout <<"Yes"<<endl;
else
cout <<"No"<<endl;
}
return 0;
}

【Uva 1220】Party at Hali-Bula的更多相关文章

  1. 【巧妙算法系列】【Uva 11464】 - Even Parity 偶数矩阵

    偶数矩阵(Even Parity, UVa 11464) 给你一个n×n的01矩阵(每个元素非0即1),你的任务是把尽量少的0变成1,使得每个元素的上.下.左.右的元素(如果存在的话)之和均为偶数.比 ...

  2. 【贪心+中位数】【UVa 11300】 分金币

    (解方程建模+中位数求最短累积位移) 分金币(Spreading the Wealth, UVa 11300) 圆桌旁坐着n个人,每人有一定数量的金币,金币总数能被n整除.每个人可以给他左右相邻的人一 ...

  3. 【UVa 10881】Piotr's Ants

    Piotr's Ants Porsition:Uva 10881 白书P9 中文改编题:[T^T][FJUT]第二届新生赛真S题地震了 "One thing is for certain: ...

  4. 【UVa 116】Unidirectional TSP

    [Link]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  5. 【UVa 1347】Tour

    [Link]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  6. 【UVA 437】The Tower of Babylon(记忆化搜索写法)

    [题目链接]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  7. 【uva 1025】A Spy in the Metro

    [题目链接]:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  8. 【Uva 11584】Partitioning by Palindromes

    [Link]:https://cn.vjudge.net/contest/170078#problem/G [Description] 给你若干个只由小写字母组成的字符串; 问你,这个字符串,最少能由 ...

  9. 【Uva 11400】Lighting System Design

    [Link]: [Description] 你要构建一个供电系统; 给你n种灯泡来构建这么一个系统; 每种灯泡有4个参数 1.灯泡的工作电压 2.灯泡的所需的电源的花费(只要买一个电源就能供这种灯泡的 ...

随机推荐

  1. sql准确判断某个ip

    问题:如图 当我执行sql要准确查找某个IP是属于哪个库室时候,我刚开始是这样写的 select * from Definition_Read_Room where HFIP like '%172.2 ...

  2. A1095 Cars on Campus (30 分)

    Zhejiang University has 8 campuses and a lot of gates. From each gate we can collect the in/out time ...

  3. SpringIOC中的注解配置

    Spring中的注解是个好东西,可以简化我们的操作,但是使用了注解又会在一定的程度上增加程序的耦合度,xml中的配置写在了类中虽然简化了开发过程,但是或多或少的违背了开闭原则.所以在开发过程中要先明确 ...

  4. Harry and magic string HDU - 5157 记录不相交的回文串对数

    题意: 记录不相交的回文串对数 题解: 正着反着都来一遍回文树 用sum1[i] 表示到 i 位置,出现的回文串个数的前缀和 sun2[i]表示反着的个数 ans+=sum1[i-1]*sum2[i] ...

  5. 关于ctype.h头文件使用说明

    ctype.h里的函数概况: 1.字符测试函数 (1)函数原型均为 int isXXX( int ch) (2)参数为int,任何参数均被转换为整形 (3)只能处理[0,127]之间的值 2.字符映射 ...

  6. RabbitMQ学习第一记:用java连接RabbitMQ

    1.什么是RabbitMQ MQ(Message Queue):消息队列,是服务端设计的一个可以存储大量消息的队列,并提供客户端操作队列的方法:生产队列(向队列中添加数据).消费队列(从队列中取数据) ...

  7. es5 JSON对象

    1. JSON.stringify(obj/arr) js对象(数组)转换为json对象(数组) 2. JSON.parse(json) json对象(数组)转换为js对象(数组) <!DOCT ...

  8. [转]SSM(Spring+SpringMVC+Mybatis)框架搭建详细教程【附源代码Demo】

    一.新建项目 运行IDEA,进入初始化界面,然后我们选择新建项目(进入主界面新建项目也是一样的) 在Maven选项卡里面找到对应的java web选项,然后我们点下一步 这一步填入组织等信息,这里比较 ...

  9. 校园商铺-2项目设计和框架搭建-10验证controller

    1.新建package:com.csj2018.o2o.web.superadmin 2.建立AreaController.java package com.csj2018.o2o.web.super ...

  10. 校园商铺-2项目设计和框架搭建-7验证Dao

    以最简单的地区表为例 1.插入数据 insert into tb_area (area_name, priority) values('东苑', 1),('南苑', 7),('北苑', 5); sel ...