国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

算法提高 金屬采集 樹形DP

2019-11-08 01:48:31
字體:
來源:轉載
供稿:網友

        題目鏈接:金屬采集

     思路:d(i, j)表示在以i為根結點的子樹中使用j個機器人的最小花費。設v為u的一個子節點,從節點i使用k個機器人收集以v為根結點的能量,狀態轉移方程為d(u, i) = min(d(u, i - k) + d(v, k) + cost * k)  1 <= k <= i. 注意d(u, i - k)表示用i - k個機器人去收集其他子樹的能量的最小花費,在遍歷所有子節點之后,d(u, i)的值才會固定。

   AC代碼:

#include <cstdio>#include <algorithm>#include <cstring>#include <utility>#include <string>#include <iostream>#include <map>#include <set>#include <vector>#include <queue>#include <stack>using namespace std;#define eps 1e-10#define inf 0x3f3f3f3f#define PI pair<int, int> const int maxn = 1e5 + 5;int dp[maxn][12]; struct node{	int son, cost; 	node() {	}	node(int son, int cost):son(son), cost(cost) {	}};vector<node>road[maxn];int n, s, cnt;void dfs(int u, int PRe) { //u-當前節點,pre-它的父節點 	int n = road[u].size();	for(int i = 0; i < n; ++i) {		int v= road[u][i].son, cost = road[u][i].cost;		if(v == pre) continue;		dfs(v, u);		// 只考慮當前節點和已經發現的節點 		for(int k = cnt; k >= 0; --k) { //該子樹停留的機器人總數		//逆序枚舉--如果d(u, k)更新,那么不能影響d(u,k+1),如果順序枚舉會影響  			dp[u][k] += dp[v][0] + cost * 2; //讓一個機器人遍歷該子樹所有子節點并返回的花費 			for(int j = 1; j <= k; ++j) {    //至少一個機器人進入子樹 				dp[u][k] = min(dp[u][k], dp[u][k-j] + dp[v][j] + j * cost);			}		} 	} }int main() {		while(scanf("%d%d%d", &n, &s, &cnt) == 3) {		memset(dp, 0, sizeof(dp));		for(int i = 0; i <= n; ++i) road[i].clear();		int x, y, cost;		for(int i = 1; i < n; ++i) {			scanf("%d%d%d", &x, &y, &cost);			road[x-1].push_back(node(y-1, cost));			road[y-1].push_back(node(x-1, cost));		}		dfs(s - 1, -1);		printf("%d/n", dp[s - 1][cnt]); 	}	return 0;}如有不當之處歡迎指出!


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 漯河市| 仪陇县| 麻栗坡县| 吴忠市| 仁寿县| 定陶县| 中江县| 嘉兴市| 米泉市| 吉木乃县| 镇康县| 昌图县| 郸城县| 台安县| 水城县| 罗田县| 沁阳市| 永康市| 静宁县| 惠来县| 武隆县| 泰宁县| 蒲江县| 鄂托克旗| 宜兰县| 肥城市| 隆安县| 东海县| 河北区| 日照市| 尉氏县| 福建省| 平塘县| 金塔县| 江门市| 桦川县| 石棉县| 靖宇县| 土默特左旗| 灯塔市| 塘沽区|