Bribing FIPA

题目链接:

http://poj.org/problem?id=3345

解题思路:

题目大意:

现在有n个村子,你想要用收买m个村子为你投票,其中收买第i个村子的代价是val[i]。但是有些村子存在从属关系,如果B从属于A

国,则收买了A也意味着买通了B,而且这些关系是传递的。问你最小要付出的代价是多少?

算法思想:

树形DP+背包。很好的一道树形DP,就是输入有点脑残。。。有可能为森林,所以先加入一个总根,连接所有森林的根。

DP部分:dp[i][j]表示以第i节点为根的子树,如果要收买j个国家的最小代价。

状态转移方程为:dp[u][j+k] = min(dp[u][j+k], val[u], dp[v][k]+dp[u][j])。这里要注意一点,就是在把子树k当为背包的时候,子数j表示

的所有背包不能有相互影响。所以需要先预处理一下。

AC代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#define INF 0x3f3f3f3f
using namespace std;const int maxn = 205;
vector<int> g[maxn];
int n,m,sum;
char name[maxn][105];
int num[maxn], val[maxn];
int tmp[maxn], dp[maxn][maxn];
bool rt[maxn];void dfs(int u){num[u] = 1;dp[u][1] = val[u];int len = g[u].size();for(int i = 0; i < len; ++i){int v = g[u][i];dfs(v);num[u] += num[v];for(int j = 0; j <= num[u]; ++j)//  预处理dp[u][j]。tmp[j] = dp[u][j];for(int j = 0; j <= num[u]-num[v]; ++j)//  背包部分。for(int k = 1; k <= num[v]; ++k)dp[u][j+k] = min(dp[u][j+k], min(val[u], dp[v][k]+tmp[j]));}
}int check(char *str){for(int i = 1; i <= sum; i ++)if(!strcmp(str, name[i]))return i;strcpy(name[sum++], str);return sum-1;
}int main(){char str[105];while(gets(str) && str[0] != '#'){sscanf(str, "%d%d", &n,&m);//sscanf()函数应用在这里很适合:把str当为输入流。memset(name, 0, sizeof(name));for(int i = 0; i <= n; ++i)g[i].clear();for(int i = 0; i <= n; ++i){for(int j = 1; j <= n; ++j)dp[i][j] = INF;dp[i][0] = 0;rt[i] = true;}sum = 1;int valtmp,u,v;for(int i = 1; i <= n; ++i){scanf("%s%d",str,&valtmp);u = check(str);val[u] = valtmp;while(getchar() != '\n'){scanf("%s",str);v = check(str);rt[v] = false;g[u].push_back(v);}}val[0] = INF;for(int i = 1; i <= n; ++i)//加入总根。if(rt[i])g[0].push_back(i);dfs(0);printf("%d\n",dp[0][m]);}return 0;
}

POJ 3345 Bribing FIPA(树形dp+背包)相关推荐

  1. [POJ 3345] Bribing FIPA

    问题描述 There is going to be a voting at FIPA (Fédération Internationale de Programmation Association) ...

  2. P2014-选课【树形dp,背包】

    正题 评测记录:https://www.luogu.org/problemnew/show/P2014 题目大意 有n门课程,每个课程有不同的学分和前修课,必须学了前修课才可以学这门. 只能修m门,求 ...

  3. POJ - 4045 Power Station(树形dp/树的重心)

    题目链接:点击查看 题目大意:给出一个n个节点的树,我们需要选出一个节点,到其余任何节点的距离和最小 题目分析:这个题我的第一反应是用树的重心,先求出来符合条件的点,然后再跑一遍dfs求距离,最后输出 ...

  4. POJ - 2342 Anniversary party(树形dp入门)

    题目链接:点击查看 题目大意:每个人都有一个快乐值,给定一个树状的从属关系,仅当上司和下属都不在的时候这个个人的快乐值才能表现出来,问怎么样才能让整体的快乐值达到最大 题目分析:做线段树做吐了,来换换 ...

  5. POJ 3585 Accumulation Degree 树形dp

    题目链接 Accumulation Degree Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5388   Accepte ...

  6. POJ 3342- Party at Hali-Bula (树形dp+判断是否唯一)

    题目: Dear Contestant, I'm going to have a party at my villa at Hali-Bula to celebrate my retirement f ...

  7. POJ 1947 Rebuilding Roads (树dp + 背包思想)

    题目链接:http://poj.org/problem?id=1947 一共有n个节点,要求减去最少的边,行号剩下p个节点.问你去掉的最少边数. dp[u][j]表示u为子树根,且得到j个节点最少减去 ...

  8. poj 2152 Fire - 经典树形dp

    题目链接: http://poj.org/problem?id=2152 不多说.. 2006 陈启峰消防站解题报告 这dp简直是神了.. #include <cstdio> #inclu ...

  9. TELE (树形DP背包扩展) #by Plato

    http://poj.org/problem?id=3017 题意:N个结点的树,有M个叶子结点,取每条边有花费Ci,取每个叶子结点有价值Pi; 求:在保证总收入(总价值-总花费)>0的情况下, ...

  10. bzoj 1017: [JSOI2008]魔兽地图DotR【树形dp+背包】

    bzoj上是一个森林啊--? dp还是太弱了 设f[i][j][k]为到点i,合成j个i并且花费k金币能获得的最大力量值,a[i]为数量上限,b[i]为价格,p[i]为装备力量值 其实这个状态设计出来 ...

最新文章

  1. 【puthon】把大量csv文件写入h5文件制作数据集
  2. Asp.net中的路由
  3. Android OpenGL ES 开发教程(20):颜色Color
  4. 博易大师 行情服务器文件,博易大师目录
  5. 使用 Java 配置进行 Spring bean 管理--转
  6. docker mysql编辑器_docker官方mysql镜像自定义配置详解
  7. Math对象方法总结(向上取整、向下取整、四舍五入、取随机数,取最大值、取最小值)
  8. 地铁售票系统设计思想及部分代码
  9. 【转】vc6.0配置STLPort
  10. 计算两个经纬度之间的距离
  11. Android 属性动画简单说明前篇(一)
  12. vue实现卡片式上下滑动_Vue实现table上下移动功能示例
  13. ABAP新手基础入门知识
  14. 《原则》瑞达利欧_epub+mobi+azw3
  15. linux最大lun空间,Linux上每个SCSI设备的最大LUN数目是多少(by quqi99)
  16. 关于长江的题目_高中关于长江的作文题目加优秀范文
  17. 今日接手一个项目,服务器重启后,mysql启动失败
  18. Package java.util.stream
  19. 音视频常见问题分析和解决:延时和抖动
  20. LIO-SAM imuPreintegration

热门文章

  1. oracle中imp命令详解,Oracle中imp命令详解
  2. vue结合element 输入框输入纯数字以及限制输入小数
  3. 线性表、栈和队列的相同点和不同点
  4. 采用晶体管作为电子元器件的计算机属于,采用晶体管作为电子元器件的计算机属于(...
  5. CentOS7环境下编译Hadoop3.2.1源码
  6. 华为开源镜像站体验评测报告
  7. 没有更改计算机日期权限,修改电脑时间_修改电脑时间没有权限
  8. 如何在Mac电脑上调整日期和时间?如何高效管理时间?
  9. java用switch判断日期_Java-用switch判断季节
  10. win10不让桌面上显示宽带连接服务器,Win10宽带连接桌面看不见了怎么办?