POJ 3345 Bribing FIPA 树上背包
http://poj.org/problem?id=3345
https://www.acwing.com/problem/content/326/
题意:
FIPA(国际国际计划协会联合会)近期将进行投票,以确定下一届IPWC(国际规划世界杯)的主办方。
钻石大陆的代表本内特希望通过以赠送钻石买通国家的方式,获得更多的投票。
当然,他并不需要买通所有的国家,因为小国家会跟随着他们附庸的大国进行投票。
换句话说,只要买通了一个大国,就等于获得了它和它统治下所有小国的投票。
例如,C在B的统治下,B在A的统治下,那么买通A就等于获得了三国的投票。
请注意,一个国家最多附庸于一个国家的统治下,附庸关系也不会构成环。
请你编写一个程序,帮助本内特求出在至少获得m个国家支持的情况下的最少花费是多少。
输入格式
输入包含多组测试数据。
第一行包含两个整数n和m,其中n表示参与投票的国家的总数,m表示获得的票数。
接下来n行,每行包含一个国家的信息,形式如下:
CountryName DiamondCount DCName DCName …
其中CountryName是一个长度不超过100的字符串,表示这个国家的名字,DiamondCount是一个整数,表示买通该国家需要的钻石数,DCName是一个字符串,表示直接附庸于该国家的一个国家的名字。
一个国家可能没有任何附庸国家。
当读入一行为#时,表示输入终止。
输出格式
每组数据输出一个结果,每个结果占一行。
数据范围
1<=m<=n<=200
经典的树上背包
dp[i][j]表示获得i国为根节点的j个国家支持最小的支出
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>
#include<sstream>
#include<string>
#define ll long long
#define ull unsigned long long
using namespace std;
const int INF = 0x3f3f3f3f;
const int maxn = 207;vector<int> V[maxn];
map<string, int> M;
int id, n, m;
int Val[maxn], flag[maxn], dp[maxn][maxn], siz[maxn];
void init() {for (int i = 0; i <= n; i++)V[i].clear();M.clear();id = 0;memset(flag, 0, sizeof flag);memset(siz, 0, sizeof siz);memset(dp, INF, sizeof dp);
}
void tree_dp(int now) {dp[now][0] = 0;siz[now] = 1;for (int i = 0; i < V[now].size(); i++) {int &to = V[now][i];tree_dp(to);siz[now] += siz[to];//for (int j = m; j >= 0; j--);for (int j = siz[now]; j >= 0; j--) {for (int k = j; k >= 0; k--) {dp[now][j] = min(dp[now][j], dp[to][k] + dp[now][j - k]);}}}if (now) {//dp[now][siz[now]] = Val[now]; !!!for (int j = 0; j <= siz[now]; j++)dp[now][j] = min(dp[now][j], Val[now]);}
}
int main() {stringstream ss;string s;while (getline(cin, s)) {if (s[0] == '#')break;ss.clear();ss << s;ss >> n >> m;init();for (int i = 1; i <= n; i++) {getline(cin, s);ss.clear();ss << s;ss >> s;if (!M.count(s))M[s] = ++id;ss >> Val[M[s]];int fat = M[s];while (ss >> s) {if (!M.count(s))M[s] = ++id;V[fat].push_back(M[s]);flag[M[s]] = 1;}}for (int i = 1; i <= id; i++)if (!flag[i])V[0].push_back(i);tree_dp(0);cout << dp[0][m] << endl;}return 0;
}
POJ 3345 Bribing FIPA 树上背包相关推荐
- [POJ 3345] Bribing FIPA
问题描述 There is going to be a voting at FIPA (Fédération Internationale de Programmation Association) ...
- luogu 2014 选课 树上背包
树上背包 #include<bits/stdc++.h>using namespace std;const int N=310; const int inf=0x3f3f3f3f; vec ...
- 【NOI online 2】游戏【二项式反演】【树上背包】
题意:一棵n=2mn=2mn=2m个点的树,mmm个白点和mmm个黑点.对于k∈[0,n]k\in [0,n]k∈[0,n],求出 把点黑白两两配对使得恰好有kkk对点有祖孙关系 的方案数 模9982 ...
- P4322 [JSOI2016]最佳团体(分数规划树上背包)
P4322 [JSOI2016]最佳团体(分数规划&树上背包) 分数问题,首先转为二分性判定问题. 每个结点的值变为:vali=ai−mid×bival_i=a_i-mid\times b_i ...
- 【2019.8.9 慈溪模拟赛 T2】摘Galo(b)(树上背包)
树上背包 这应该是一道树上背包裸题吧. 众所周知,树上背包的朴素\(DP\)是\(O(nm^2)\)的. 但对于这种体积全为\(1\)的树上背包,我们可以通过记\(Size\)优化转移时的循环上界,做 ...
- 2021 ICPC Southeastern Europe Regional Contest Werewolves(树上背包)
2021 ICPC Southeastern Europe Regional Contest Werewolves(树上背包) 链接 题意:给出一个n个节点的树(n≤3000n\le3000n≤300 ...
- (P2014[CTSC1997])选课(树上背包)
题目链接:[CTSC1997] 选课 - 洛谷 分析:这是一道树上背包的模板题,什么是树上背包呢?就是说物品之间有依赖关系,就比如说选a就必须要先选b,选b又必须要先选c,大概就是这个意思,类似于我们 ...
- 树上背包 CF815C Karen and Supermarket
CF815C Karen and Supermarket Description Karen有 b b b 美元,超市出售 N N N 种商品.第 i i i 件商品可以以 c i c_i ci 美 ...
- BZOJ 2133 切割(树形DP,树上背包)大概是本题全网第一篇题解 >_<【BZOJ 修复工程】
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 BZOJ 2133 切割这道题全网搜不到任何一篇题解 >_< 看评测记录也没有几个人AC- ...
- Luogu P3177 [HAOI2015] 树上染色(树上背包)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Luogu P3177 [HAOI2015] 树上染色 有一棵点数为 NNN 的树,树边有边权.给你一 ...
最新文章
- 算法 字符串转换为以为数组
- CPU飙高,频繁GC,怎么排查?
- 为了测试Writer的发图功能,也为了让girls现身。
- 一文搞懂JVM架构和运行时数据区,全网最新
- 2022年Java程序设计讲课笔记
- Java里面as_与Java中的C#关键字“ as”等效
- [置顶] Ubuntu 12.04中文输入法的安装
- Struts2请求处理流程及源码分析
- Windows PrintNightmare 漏洞和补丁分析
- 人人都能懂的Vue源码系列—08—initLifecycle
- 关于第十届省赛失败的总结
- 错误java.lang.NoClassDefFoundError: org/jaxen/VariableContext
- Canvas API(画布)简介
- Linux C语言学习day11:递归与结构体
- miui12会基于android10吗,全新MIUI12马上发布,基于Android11打造,小米10首批升级
- mk编译报错-提示找不到符号
- ETL——实现Kettle作业定时任务
- 移动硬盘插服务器上坏了,移动硬盘接口坏了怎么办解决教程
- 利用Python实现视频中人物的人脸转换超详细教程
- daimayuan每日一题#863 吃糖果
热门文章
- 如何用python计算增长率_如何用excel函数来计算增长率?
- 对硬盘进行分区时,GPT和MBR有什么区别
- PyTorch实战 | 文本情感分类任务 | LSTM与LSTM+Attention | TextCNN
- 从微信导出表情包的简便方法 (不使用微信 for pc,无需进入文件夹寻找!)
- 导出微信添加的自定义表情(动图)
- win10上运行ROS时报:qt.qpa.plugin:Cound not find the Qt platform plugin “windows“
- 2015年度APP分类
- word文档怎么压缩大小?
- 西安交大计算机研究生拟录取,西安交通大学2018硕士研究生拟录取名单公示
- 上海驾照科目三练习笔记