uva 4015 - Caves Chengdu 2007 树形背包★
2016-01-24 11:53
253 查看
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4153
题意:一棵n个节点的有根树,树的边有正整数权,表示两个节点之间的距离,你的任务是回答这样的询问,从根节点出发,走不超过x单位的距离,最多能走多少个节点,节点经过多次算一个,对于每次的询问输出:经过节点数最大的值
题意:一棵n个节点的有根树,树的边有正整数权,表示两个节点之间的距离,你的任务是回答这样的询问,从根节点出发,走不超过x单位的距离,最多能走多少个节点,节点经过多次算一个,对于每次的询问输出:经过节点数最大的值
/**========================================== * This is a solution for ACM/ICPC problem * * @source:uva 4015 - Caves * @type: dp * @author: wust_ysk * @blog: http://blog.csdn.net/yskyskyer123 * @email: 2530094312@qq.com *===========================================*/ #include<cstdio> #include<string> #include<cstring> #include<iostream> #include<cmath> #include<algorithm> #include<vector> using namespace std; typedef long long ll; const int INF =0x3f3f3f3f; const int maxn=500 ; //const int maxV=12 ; int n,m,root; bool vis[maxn+4]; int dp[maxn+4][2][maxn+4]; struct Edge { int from,to,w; Edge(){} Edge(int from,int to,int w):from(from),to(to),w(w){} }; vector<int >G[maxn+4]; vector<Edge >edges; void init() { for(int i=0;i<n;i++) { G[i].clear(); } edges.clear(); } void add_edge(int fa,int x,int w) { edges.push_back(Edge(fa,x,w)); int k=edges.size(); G[fa].push_back(k-1); } void dfs(int x) { memset(dp[x],0x3f,sizeof dp[x]); dp[x][0][1]=0; dp[x][1][1]=0; for(int i=0;i<G[x].size();i++) { Edge & e=edges[G[x][i] ]; int y=e.to; int w=e.w; dfs(y); for(int v=n;v>=1;v--) { for(int v2=1;v2<v;v2++) { dp[x][0][v]=min(dp[x][0][v],dp[x][0][v-v2]+dp[y][0][v2]+2*w); dp[x][1][v]=min(dp[x][1][v],dp[x][0][v-v2]+dp[y][1][v2]+w); dp[x][1][v]=min(dp[x][1][v],dp[x][1][v-v2]+dp[y][0][v2]+2*w); } } } } int main() { int x,y,w,kase=0; while(~scanf("%d",&n)&&n) { init(); memset(vis,0,sizeof vis); for(int i=1;i<n;i++) { scanf("%d%d%d",&x,&y,&w); add_edge(y,x,w); vis[x]=1; } for(int i=0;i<n;i++) if(!vis[i]) { root=i; break; } dfs( root); scanf("%d",&m); printf("Case %d:\n",++kase); while(m--) { scanf("%d",&x); int p=upper_bound(dp[root][1]+1,dp[root][1]+n+1,x )-dp[root][1]; printf("%d\n",p-1); } } return 0; }
相关文章推荐
- 数据库,你好!
- JavaScript 正则表达式 RegExp 对象
- 【OpenGL/ES系列教程】 第二讲 Android jni 调用OpenGL ES 2.0
- Swift - 使用网格(UICollectionView)进行流布局
- 两种分解整数为字符串的方法 阿姆斯特朗数
- Codeforces 617 D
- Which statement is true about loading data using the conventional path of SQL*Loader? A.Redo is not
- 初学C做下记录
- Java基础5
- POJ 1797 Heavy Transportation(Dijkstra)
- centos svn搭建 简单手册
- KVM之初体验——QEMU安装虚拟机
- logstash grok解析
- Java基础4
- USACO-Section 3.1-PROB Score Inflation
- Codeforces Round #340 (Div. 2)——C
- Codeforces Round #340 (Div. 2)题解
- gitlab和Django实现push自动更新
- gitlab和Django实现push自动更新
- gitlab和Django实现push自动更新