POJ3345 Bribing FIPA(树形DP)
题意:有n个国家,贿赂它们都需要一定的代价,一个国家被贿赂了从属这个国家的国家也相当于被贿赂了,问贿赂至少k个国家的最少代价。
这些国家的从属关系形成一个森林,加个超级根连接,就是一棵树了,考虑用DP:
- dp[u][m]表示以u国家为根的子树贿赂m个国家的最少代价
单单这样的话转移是指数级的,其实这题就是树上背包,同HDU1516。现在觉得想明白了,其实就是所有结点为根做n次01背包,每次01背包的物品就是当前根的各个儿子。
状态加一维度表示,转移就可以不是指数级了:
- dp[u][n][m]表示以u国家为根的前n个儿子构成的子树贿赂m个国家的最少代价
然后其实循环利用内存,像01背包一样省去一维背包从大到小枚举,然后就是那样了。。
#include<cstdio>
#include<cstring>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
#define INF (1<<29)
#define MAXN 222 struct Edge{
int u,v,next;
}edge[MAXN];
int NE,head[MAXN];
void addEdge(int u,int v){
edge[NE].u=u; edge[NE].v=v; edge[NE].next=head[u];
head[u]=NE++;
} int n,k,cost[MAXN],d[MAXN][MAXN],size[MAXN];
void getsize(int u){
size[u]=;
for(int i=head[u]; i!=-; i=edge[i].next){
int v=edge[i].v;
getsize(v);
size[u]+=size[v];
}
}
void dfs(int u){
if(u) d[u][size[u]]=cost[u];
for(int i=head[u]; i!=-; i=edge[i].next){
int v=edge[i].v;
dfs(v);
for(int j=size[u]; j>=; --j){
for(int k=; k<j; ++k) d[u][j]=min(d[u][j],d[u][k]+d[v][j-k]);
}
}
} bool read(char *&s,int &t){
if(sscanf(s,"%d",&t)!=) return ;
while(*s==' ') ++s;
while(*s>='' && *s<='') ++s;
while(*s==' ') ++s;
return ;
}
bool read(char *&s,char *str){
if(sscanf(s,"%s",str)!=) return ;
while(*s==' ') ++s;
while(*s && *s!=' ') ++s;
while(*s==' ') ++s;
return ;
} char str[];
string name[MAXN<<];
int main(){
int w[MAXN]; char ts[MAXN];
while(gets(str) && str[]!='#'){
char *s=str;
read(s,n); read(s,k); int nn=;
vector<string> vec[MAXN];
for(int i=; i<n; ++i){
gets(str); s=str;
read(s,ts); name[nn++]=ts; vec[i].push_back(ts);
read(s,w[i]);
while(read(s,ts)){
name[nn++]=ts; vec[i].push_back(ts);
}
}
sort(name+,name+nn);
nn=unique(name+,name+nn)-name; NE=;
memset(head,-,sizeof(head));
int deg[MAXN]={};
for(int i=; i<n; ++i){
int u=lower_bound(name+,name+nn,vec[i][])-name;
cost[u]=w[i];
for(int j=; j<vec[i].size(); ++j){
int v=lower_bound(name+,name+nn,vec[i][j])-name;
addEdge(u,v); ++deg[v];
}
}
for(int i=; i<=n; ++i){
if(deg[i]==) addEdge(,i);
} getsize();
for(int i=; i<=n; ++i){
for(int j=; j<=n; ++j) d[i][j]=INF;
}
dfs();
int res=INF;
for(int i=k; i<=n; ++i) res=min(res,d[][i]);
printf("%d\n",res);
}
return ;
}
POJ3345 Bribing FIPA(树形DP)的更多相关文章
- POJ 3345 Bribing FIPA 树形DP
题目链接: POJ 3345 Bribing FIPA 题意: 一个国家要参加一个国际组织, 需要n个国家投票, n个国家中有控制和被控制的关系, 形成了一颗树. 比如: 国家C被国家B控制, 国 ...
- poj3345 Bribing FIPA【树形DP】【背包】
Bribing FIPA Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 5910 Accepted: 1850 Desc ...
- POJ3345 Bribing FIPA 【背包类树形dp】
题目链接 POJ 题解 背包树形dp板题 就是读入有点无聊,浪费了很多青春 #include<iostream> #include<cstdio> #include<cm ...
- poj 3345 Bribing FIPA (树形背包dp | 输入坑)
题目链接: poj-3345 hdu-2415 题意 有n个国家,你要获取m个国家的支持,获取第i个国家的支持就要给cost[i]的价钱 其中有一些国家是老大和小弟的关系,也就是说,如果你获 ...
- POJ3345 Bribing FIPA
Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 5021 Accepted: 1574 Description There ...
- 【转】【DP_树形DP专辑】【9月9最新更新】【from zeroclock's blog】
树,一种十分优美的数据结构,因为它本身就具有的递归性,所以它和子树见能相互传递很多信息,还因为它作为被限制的图在上面可进行的操作更多,所以各种用于不同地方的树都出现了,二叉树.三叉树.静态搜索树.AV ...
- 【DP_树形DP专题】题单总结
转载自 http://blog.csdn.net/woshi250hua/article/details/7644959#t2 题单:http://vjudge.net/contest/123963# ...
- HDU 2415 Bribing FIPA
Bribing FIPA Time Limit: 1000ms Memory Limit: 32768KB This problem will be judged on HDU. Original I ...
- Bribing FIPA
Bribing FIPA 给出多棵有n个节点的有根树,第i个节点有一个权值\(a_i\),定义一个点能控制的点为其所有的子节点和它自己,询问选出若干个点的最少的权值之和,并且能够控制大于等于m个点,\ ...
随机推荐
- Java基础-6流程控制
一).选择控制: 选择控制分为两种:if...else...和switch 单分支结构:这是最简单的一种选择结构,它只是简单的判断某个条件是否成立,如果成立就执行一段代码,语句形式为: if(条件表达 ...
- 【转载】Unity3D研究院之共享材质的巧妙用法(sharedMaterial效率问题)
如果你需要修改模型材质的颜色,或者是修改材质Shader的一些属性, 通常情况是用获取模型的Renderer组件,然后获取它的material属性. 举个简单的例子,修改颜色或者直接更换shader ...
- ASP.NET Core API ---状态码
摘录自:https://www.cnblogs.com/cgzl/p/9047626.html 状态码是非常重要的,因为只有状态码会告诉API的消费者: 请求是否如预期的成功,或者失败 如果出现了错误 ...
- hnust 原石法阵
问题 F: 原石法阵 时间限制: 1 Sec 内存限制: 128 MB提交: 1098 解决: 161[提交][状态][讨论版] 题目描述 WZH有一个由原石构成的n阶三角形魔法阵,三角形魔法阵如 ...
- STL之map&multimap使用简介
map 1.insert 第一种:用insert函数插入pair数据 #include <map> #include <string> #include <iostrea ...
- myEclipse如何将程序部署到tomcat(附录MyEclipse调试快捷键)
部署 1.选中你要部署的项目,在工具栏找到 Deploy MyEclipse J2EE Project to Server 2.单击Add,即出现如下界面.选择相应的Server,要和你在配置tomc ...
- Hexo添加字数统计、阅读时长
统计插件 配置 NexT 主题默认已经集成了文章[字数统计].[阅读时长]统计功能,如果我们需要使用,只需要在主题配置文件 _config.yml 中打开 wordcount 统计功能即可.如下所示: ...
- (总结)Nginx使用的php-fpm的两种进程管理方式及优化
PS:前段时间配置php-fpm的时候,无意中发现原来它还有两种进程管理方式.与Apache类似,它的进程数也是可以根据设置分为动态和静态的. php-fpm目前主要又两个分支,分别对应于php-5. ...
- BZOJ 1014 [JSOI2008]火星人prefix | Splay维护哈希值
题目: 题解: #include<cstdio> #include<algorithm> #include<cstring> typedef long long l ...
- P2625 豪华游轮 (背包$dp$,数学)
题目链接 Solution 贼有意思的一个题目. 可以发现阻止我们走的更远的就是那些需要反向走的路程. 然后发现当角度越接近 \(180^\circ\) ,对我们最终的答案则更优. 所以先是一个背包把 ...