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个点,\ ...
随机推荐
- day06_02 元组
1.0 元组 元组被称为只读列表,即数据可以被查询,但不能被修改,所以,列表的切片操作同样适用于元组.元素卸载小括号(())里,元素之间用逗号隔开. tup1 = () #空元组 tup2 = (20 ...
- 求 n的阶乘
def chengji(n): if n == 0: return 1 return chengji(n-1)*nprint(chengji(n))
- (笔记) RealTimeRender[实时渲染] C3
@author: 白袍小道 转载表明,查看随缘 前言: 从历史上看,图形加速始于每个像素扫描线上的插值颜色重叠一个三角形,然后显示这些值.包括访问图像数据允许纹理应用于表面.添加硬件 插入和测试z深度 ...
- 1043 Is It a Binary Search Tree (25 分)(二叉查找树)
#include<bits/stdc++.h> using namespace std; typedef struct node; typedef node *tree; struct n ...
- JavaWeb笔记(八)JQuery
三个版本 1.x:兼容 ie678,使用最为广泛的,官方只做BUG维护, 功能不再新增.因此一般项目来说,使用1.x版本就可以了 最终版本:1.12.4 2.x:不兼容ie678,很少有人使用,官方只 ...
- SQLEXPRESS 2012 安装NorthWind和Pub数据库
安装SQL后,学习时总是没有这两个示例数据库. 先从微软那里下载此文件. 网址:http://www.microsoft.com/en-us/download/details.aspx?id=2365 ...
- c# json 反序列化 泛型List 2行代码
List<EncyTable> list = new List<EncyTable>(); var jsonReqeust = "[{ENCY_ID:775,ENCY ...
- 29个android开发常用的类、方法及接口
在安卓开发中,我们常常都需要借助各种各样的方法.类和接口来实现相关功能.提升开发效率,但对于初学者而言,什么时候该用什么类.方法和接口呢?下面小编整理了29个,日常开发中比较常用的类.方法.接口及其应 ...
- hdu 1007 Quoit Design (最近点对问题)
Quoit Design Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tot ...
- spring in action 学习十二:property placeholder 注解的方式实现避免注入外部属性硬代码化
这里的注解是指@PropertySource这个注解.用@PropertySource这个注解加载.properties文件. 案例的目录结构如下: student.properties的代码如下: ...