UVA-01220 Party at Hali-Bula (树形DP+map)

题目链接:https://vjudge.net/problem/UVA-1220



思路:

  • 树形DP模板题,求最大人数很简单,难点在于如何判断最大人数的名单是否有不同的情况;
  • 解决方法是用一个数组f[manx][2]记录该节点是否出场的情况,为真时代表有多种情况;
  • 具体讨论:
  1. 当父节点的值加上某个子节点的值时,他的f的情况也和该子节点一样;
  2. 当某个节点dp(i, 0) == dp(i, 1), 则该节点以及它的父节点也一定有多种情况(父节点必定取其中之一)。


Code:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 map<string, int> mp;
 4 vector<int> T[210];
 5 int dp[210][2];
 6 bool f[210][2];
 7
 8 void dfs(int x, int fa) {
 9     int len = T[x].size();
10     for (int i = 0; i < len; ++i)
11         dfs(T[x][i], x);
12     dp[fa][1] += dp[x][0];
13     if (f[x][0]) f[fa][1] = 1;
14     if (dp[x][1] > dp[x][0]) {
15         dp[fa][0] += dp[x][1];
16         if (f[x][1]) f[fa][0] = 1;
17     }
18     else {
19         dp[fa][0] += dp[x][0];
20         if (f[x][0] || dp[x][1] == dp[x][0]) f[fa][0] = 1;
21     }
22 }
23
24 int main() {
25     int n, tot;
26     string boss, fa, son;
27     while(cin>>n, n) {
28         memset(dp, 0, sizeof(dp));
29         memset(f, 0, sizeof(f));
30         mp.clear();
31         cin>>boss;
32         mp[boss] = tot = 1;
33         int ff, s;
34         for (int i = 1; i < n; ++i) {
35             cin>>son>>fa;
36             if (mp.count(fa)) ff = mp[fa];
37             else ff = ++tot, mp[fa] = ff;
38             if (mp.count(son)) s = mp[son];
39             else s = ++tot, mp[son] = s;
40             T[ff].push_back(s);
41             dp[i][1] = 1;
42         }
43         dp[n][1] = 1;
44         dfs(1, 0);
45         bool flag = 1;
46         int ans = max(dp[1][0], dp[1][1]);
47         if (dp[1][1] == dp[1][0]) flag = 0;
48         else if (dp[1][1] > dp[1][0]) {if (f[1][1]) flag = 0;}
49         else if (dp[1][1] < dp[1][0]) {if (f[1][0]) flag = 0;}
50         cout<<ans<<" ";
51         if (flag) cout<<"Yes"<<endl;
52         else cout<<"No"<<endl;
53         for (int i = 0; i <= n; ++i) T[i].clear();
54     }
55
56     return 0;
57 }
时间: 2024-09-29 03:18:56

UVA-01220 Party at Hali-Bula (树形DP+map)的相关文章

UVa 1220 Party at Hali-Bula (树形DP,最大独立集)

题意:公司有 n 个人形成一个树形结构,除了老板都有唯一的一个直系上司,要求选尽量多的人,但不能同时选一人上和他的直系上司,问最多能选多少人,并且是不是唯一的方案. 析:这个题几乎就是树的最大的独立集问题,只不过多一个判断唯一性而已.用两个数组,一个用来记录人数,一个用来判断唯一性. d[u][0],表示以 u 为根的子树中,不选 u 点能够得到最大人数,那么d[u][1]就是选 u 点能达到最大人数. f[u][0]类似,表示以 u 为根的子树中,不选 u 点是否唯一,那么f[u][1]就是选

UVA 11174 Stand in a Line 树形dp+计数

题目链接:点击打开链接 题意:白书的P103. 加个虚根就可以了...然后就是一个多重集排列. import java.io.PrintWriter; import java.util.ArrayList; import java.util.Scanner; public class Main { static int N = 40100; ArrayList<Integer>[] G = new ArrayList[N]; static long mod = 1000000007; long

UVA - 1218 Perfect Service(树形dp)

题目链接:id=36043">UVA - 1218 Perfect Service 题意 有n台电脑.互相以无根树的方式连接,现要将当中一部分电脑作为server,且要求每台电脑必须连接且仅仅能连接一台server(不包含作为server的电脑).求最少须要多少台电脑作为server. 思路 典型的树形dp问题,那么我们来建立模型. d(u,0):u是server,孩子是不是server均可 d(u,1):u不是server,u的父亲是server,u的孩子不能是server d(u,2)

uva 12186 Another Crisis 树形dp

// uva 12186 Another Crisis 树形dp // // 对于一个节点u,有k个子节点,则至少有c = (k * T - 1) / 100 + 1才能 // 发信,即c / k >= T / 100,则 c 的值为 k * T /100,上取整变成上式 // 将所有的子节点d从小到大排序,取前c个就是d[u]的值 // 紫书上的一题,之前看了好久好久,觉得挺好的,然而一直没做,今天就来 // 体验体验,挺好的一题,注意一下,如果一个节点是叶节点,直接return 1就好 //

uva 1220 - Party at Hali-Bula 【入门树形dp】

题目:uva 1220 - Party at Hali-Bula 题意:一个公司员工要举行聚会,要求任意一个人不能和他的直接上司同时到场,一个员工只有一个支系上司,现在求最多有多少人到场,并且方案是否唯一 分析:分析发现是要求一个树的最大独立集.这里可以用树形dp解决. 定义dp[x][0]:表示在 i 点不选 i 点的以 x 为子树的最大独立集 而dp[x][1] 表示x到场的最大独立集 定义f [x][0]:表示以x为根且x点不选的子树是否唯一 ,f[x][1]表示以x为根且x选的子树是否唯

uva 1484 - Alice and Bob&#39;s Trip(树形dp)

题目链接:uva 1484 - Alice and Bob's Trip 题目大意:Alice和Bob小两口一起出去旅行,他们从0城市出发,Bob喜欢走比较远的路,因为他是个勤奋的好孩子,Alice喜欢走比较近的路,因为她是一个不勤奋的坏孩子,所以有了意见上的分歧,于是乎在出门前他们约法三章,要求说最后的距离值在[l,r]之间,并且由夫妻两轮流做决定,决定说下一个城市去哪里.现在给出n个城市,以及n-1条边,问说在不让Bob媳妇生气的情况下,Bob最远能走多远(不违反约定),如果无法做到不违反约

uva 10859 Placing Lampposts,树形dp

// uva 10859 Placing Lampposts // 树形dp // // 题目的意思是一个无向无环图中,有一些顶点和一些边 // 要在顶点上放置灯笼(灯笼可以照亮与它相邻接的点), // 使得所有的边都能被灯笼照亮,其中可能有一些边被两个灯笼 // 照亮,则要求使得所有边都被灯笼照亮所需灯笼的最小值, // 并且,此时边同时被两个灯笼照亮的数目应尽可能的多 // // 思路是 // d[i][0]表示在节点i不放置灯笼所需的灯笼的最小值 // d[i][1]表示在节点i放置灯笼所

UVA 12186 Another Crisis(树形DP)

A couple of years ago, a new world wide crisis started, leaving many people with economical problems. Some workers of a particular company are trying to ask for an increase in their salaries. The company has a strict hierarchy, in which each employee

POJ 3398 / UVA 1218 Perfect Service 树形DP

树形DP Perfect Service Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 1378   Accepted: 668 Description A network is composed of N computers connected by N ? 1 communication links such that any two computers can be communicated via a uniqu