ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

luoguP1273 有线电视网

2020-03-14 14:06:20  阅读:230  来源: 互联网

标签:luoguP1273 子树 int 有线电视 cost MAXN 为根 maxl


很显然吧,直接做树形dp
两维
以什么为根的子树
选择多少个用户
所能得到的最大价值

注意 中转站不算
直接在转移的时候维护一下就好了

#include<bits/stdc++.h>
#define MAXN 3000
using namespace std;

//f[i][j]以i为根的子树选取j个用户的最大利润
//f[i][j] = max(f[i][j] , f[i][k]+f[s][j-k]-cost(i,s)[s是i的儿子])

int n,m,tot,maxl;
int h[MAXN+5],num[MAXN+5],f[MAXN+5][MAXN+5],sz[MAXN+5];

struct node{
	int from,to,cost,next;
}e[MAXN<<1+5];

void init(){
	tot = 0;
	memset(h , -1 , sizeof(h));
	memset(num , 0 , sizeof(num));
}

void add(int x , int y , int z){
	tot++;
	e[tot].from = x;
	e[tot].to = y;
	e[tot].cost = z;
	e[tot].next = h[x];
	h[x] = tot;
}

int dfs(int now){
	f[now][0]=0;
	for(int i = h[now] ; i != (-1) ; i = e[i].next){
		dfs(e[i].to);sz[now] += sz[e[i].to];
		for(int j = sz[now] ; j > 0 ; j--){
			for(int k = 1 ; k <= sz[e[i].to] ; k++){
				f[now][j] = max(f[now][j] ,f[now][j-k] + f[e[i].to][k] - e[i].cost);
			}
		}
	}
}

int main(){
	init();
	cin>>n>>m;
	for(int i = 1 ; i<= n - m ; i++){
		int k,a,c;cin>>k;
		for(int j = 1 ; j <= k ; j++){
			cin>>a>>c;
			add(i , a , c);
		}
	}
	for(int i = n - m + 1 ; i <= n ; i++)sz[i] = 1;
	for(int i =1; i<=n;i++)for(int j=1;j<=n;j++)f[i][j] = -9999999;
	for(int i = n - m + 1 ; i <= n ; i++)cin>>f[i][1];
	dfs(1);
	int maxl=0;
	for(int i=0;i<=m;i++)if(f[1][i]>=0)maxl = i;
	cout<<maxl<<endl;
}

标签:luoguP1273,子树,int,有线电视,cost,MAXN,为根,maxl
来源: https://blog.csdn.net/qq_41567618/article/details/104859133

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有