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个点,\ ...
随机推荐
- [译]17-spring基于java代码的配置元数据
spring还支持基于java代码的配置元数据.不过这种方式不太常用,但是还有一些人使用.所以还是很有必要介绍一下. spring基于java代码的配置元数据,可以通过@Configuration注解 ...
- about 2018
2018想要完成的10件事情 1 活出更纯粹的自己. 未完成2 自考本科一定要过. ...
- Python全栈工程师(编码)
ParisGabriel Python 入门基础 补充: 主流3操作大系统 Windows: Winxp Win7 Win8 Win10 Unix: Solaris(SUN) IO ...
- python完成留言板功能
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="utf-8&quo ...
- 哈希URAL 1941 - Scary Martian Word
A - Scary Martian Word Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I ...
- poj 1743 Musical Theme (后缀数组+二分法)
Musical Theme Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 16162 Accepted: 5577 De ...
- 修复linux密码
To reset the root password of your server, you will need to boot into single user mode. Access the M ...
- ci动态设置config配置
$this->config->set_item('cookie', 'item_value');echo $this->config->item('cookie');
- gitHub优秀android项目
转自:http://blog.csdn.net/shulianghan/article/details/18046021 主要介绍那些不错个性化的View,包括ListView.ActionBar.M ...
- Android四大组件:Service
前言 Service作为Android四大组件之一,应用非常广泛 本文将介绍对Service进行全面介绍(基础认识.生命周期.使用和应用场景) 目录 目录 1. 基础知识 定义:服务,属于Androi ...