日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【树形dp】vijos1144小胖守皇宫

發(fā)布時間:2023/12/18 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【树形dp】vijos1144小胖守皇宫 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

細(xì)節(jié)很精妙

描述

huyichen世子事件后,xuzhenyi成了皇上特聘的御前一品侍衛(wèi)。

皇宮以午門為起點(diǎn),直到后宮嬪妃們的寢宮,呈一棵樹的形狀;某些宮殿間可以互相望見。大內(nèi)保衛(wèi)森嚴(yán),三步一崗,五步一哨,每個宮殿都要有人全天候看守,在不同的宮殿安排看守所需的費(fèi)用不同。

可是xuzhenyi手上的經(jīng)費(fèi)不足,無論如何也沒法在每個宮殿都安置留守侍衛(wèi)。

幫助xuzhenyi布置侍衛(wèi),在看守全部宮殿的前提下,使得花費(fèi)的經(jīng)費(fèi)最少。

格式

輸入格式

輸入文件中數(shù)據(jù)表示一棵樹,描述如下:

第1行 n,表示樹中結(jié)點(diǎn)的數(shù)目。

第2行至第n+1n+1行,每行描述每個宮殿結(jié)點(diǎn)信息,依次為:該宮殿結(jié)點(diǎn)標(biāo)號i(0<i \le n0<i≤n),在該宮殿安置侍衛(wèi)所需的經(jīng)費(fèi)k,該點(diǎn)的兒子數(shù)m,接下來m個數(shù),分別是這個節(jié)點(diǎn)的m個兒子的標(biāo)號r_1, r_2, \cdots, r_mr1?,r2?,?,rm?。

對于一個n(0 < n \le 15000<n≤1500)個結(jié)點(diǎn)的樹,結(jié)點(diǎn)標(biāo)號在1到n之間,且標(biāo)號不重復(fù)。保證經(jīng)費(fèi)總和不超過2^31-1231?1。

輸出格式

輸出文件僅包含一個數(shù),為所求的最少的經(jīng)費(fèi)。

題目分析

有些細(xì)節(jié)處理真的是非常精妙。

分析詳見初涉樹形dp【權(quán)最小點(diǎn)覆蓋】vijos1144皇宮看守

1 #include<bits/stdc++.h> 2 const int maxn = 2003; 3 4 int f[maxn][3],a[maxn],n,rt; 5 int head[maxn],nxt[maxn<<1],edges[maxn<<1],edgeTot; 6 bool vis[maxn]; 7 8 int read() 9 { 10 char ch = getchar(); 11 int num = 0; 12 bool fl = 0; 13 for (; !isdigit(ch); ch = getchar()) 14 if (ch=='-') fl = 1; 15 for (; isdigit(ch); ch = getchar()) 16 num = (num<<1)+(num<<3)+ch-48; 17 if (fl) num = -num; 18 return num; 19 } 20 inline int min(int a, int b){return a<b?a:b;} 21 inline int min(int a, int b, int c){int t=min(a,b);return t<c?t:c;} 22 void addedge(int u, int v) 23 { 24 edges[++edgeTot] = v, nxt[edgeTot] = head[u], head[u] = edgeTot; 25 vis[v] = 1; 26 } 27 void dfs(int now) 28 { 29 int delta = 2e9; 30 for (int i=head[now]; i!=-1; i=nxt[i]) 31 { 32 int v = edges[i]; 33 dfs(v); 34 f[now][0] += min(f[v][1], f[v][2]); 35 f[now][1] += min(f[v][1], f[v][2]); 36 delta = min(f[v][2]-f[v][1], delta); 37 f[now][2] += min(f[v][0], f[v][1], f[v][2]); 38 } 39 delta = std::max(delta, 0); 40 f[now][1] += delta; 41 } 42 int main() 43 { 44 memset(head, -1, sizeof head); 45 n = read(); 46 for (int i=1; i<=n; i++) 47 { 48 int p = read(), k; 49 f[p][2] = a[p] = read(), k = read(); 50 while (k--) addedge(p, read()); 51 } 52 rt = 1; 53 while (vis[rt]) rt++; 54 dfs(rt); 55 printf("%d\n",min(f[rt][1], f[rt][2])); 56 return 0; 57 }

?

?

?

END

轉(zhuǎn)載于:https://www.cnblogs.com/antiquality/p/9246654.html

總結(jié)

以上是生活随笔為你收集整理的【树形dp】vijos1144小胖守皇宫的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。