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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

编程问答

[SDOI2006] 保安站岗

發(fā)布時(shí)間:2024/4/17 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [SDOI2006] 保安站岗 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目鏈接

第一遍不知道為什么就爆零了……

第二遍改了一下策略,思路沒(méi)變,結(jié)果不知道為什么就 A 了???

樹(shù)形 DP 經(jīng)典問(wèn)題:選擇最少點(diǎn)以覆蓋樹(shù)上所有點(diǎn)(邊)。

對(duì)于本題,設(shè) dp[i][0/1][0/1] 表示第 i 個(gè)節(jié)點(diǎn),其父親節(jié)點(diǎn)選 / 沒(méi)選中,且選 / 不選當(dāng)前節(jié)點(diǎn)的最小代價(jià)。

發(fā)現(xiàn)選中當(dāng)前點(diǎn)時(shí),周圍的點(diǎn)就愛(ài)怎樣怎樣了,自然是選費(fèi)用小的……沒(méi)選中時(shí),如果父親節(jié)點(diǎn)選了那同上;

如果父親也沒(méi)選,那么對(duì)于其子節(jié)點(diǎn):

如果存在一個(gè)滿足“選擇它的代價(jià)比不選它的小”,那么一定貪心的選了它,其他的就依然愛(ài)怎樣怎樣了(無(wú)情)……

如果沒(méi)有這樣的一個(gè)子節(jié)點(diǎn),那就只好選一個(gè)費(fèi)用差的最小的選了它 233。

代碼:

1 #include <queue> 2 #include <cstdio> 3 #include <cctype> 4 #include <cstring> 5 #include <iostream> 6 #include <algorithm> 7 using namespace std; 8 9 const int maxn = 1500 + 10; 10 int n, m, head[maxn], val[maxn], dp[maxn][2][2], edge_num; 11 12 struct Edge { int v, nxt; } edge[maxn << 1]; 13 14 inline int read() { 15 register char ch = 0; register int w = 0, x = 0; 16 while( !isdigit(ch) ) w |= (ch == '-'), ch = getchar(); 17 while( isdigit(ch) ) x = (x * 10) + (ch ^ 48), ch = getchar(); 18 return w ? -x : x; 19 } 20 21 inline void Add_edge(int u, int v) { 22 edge[++edge_num].v = v; 23 edge[edge_num].nxt = head[u], head[u] = edge_num; 24 } 25 26 inline void Deep_fs(int x, int p) { 27 int flag = 0, tmp = 1e8; 28 for(int i = head[x]; i; i = edge[i].nxt) { 29 if( edge[i].v == p ) continue; 30 Deep_fs(edge[i].v, x); 31 if( dp[edge[i].v][0][0] >= dp[edge[i].v][0][1] ) flag = 1; 32 dp[x][0][0] = dp[x][0][0] + min(dp[edge[i].v][0][0], dp[edge[i].v][0][1]); 33 dp[x][0][1] = dp[x][0][1] + min(dp[edge[i].v][1][0], dp[edge[i].v][1][1]); 34 dp[x][1][0] = dp[x][1][0] + min(dp[edge[i].v][0][0], dp[edge[i].v][0][1]); 35 dp[x][1][1] = dp[x][1][1] + min(dp[edge[i].v][1][0], dp[edge[i].v][1][1]); 36 } 37 if( !flag ) for(int i = head[x]; i; i = edge[i].nxt) { 38 if( edge[i].v == p ) continue; 39 tmp = min(tmp, dp[x][0][0] - dp[edge[i].v][0][0] + dp[edge[i].v][0][1]); 40 } 41 if( !flag ) dp[x][0][0] = tmp; 42 dp[x][0][1] = dp[x][0][1] + val[x], dp[x][1][1] = dp[x][1][1] + val[x]; 43 } 44 45 int main(int argc, const char *argv[]) 46 { 47 freopen("..\\nanjolno.in", "r", stdin); 48 freopen("..\\nanjolno.out", "w", stdout); 49 50 scanf("%d", &n); 51 for(int u, v, k, i = 1; i <= n; ++i) { 52 u = read(), val[u] = read(), k = read(); 53 for(int j = 1; j <= k; ++j) v = read(), Add_edge(u, v), Add_edge(v, u); 54 } 55 Deep_fs(1, 0), printf("%d\n", min(dp[1][0][0], dp[1][0][1])); 56 57 fclose(stdin), fclose(stdout); 58 return 0; 59 }

?

 —— 花朵以芬芳熏香了空氣;但它最終的任務(wù),是把自己獻(xiàn)上給你。
    人們從詩(shī)人的字句里,選取自己心愛(ài)的意義:但是詩(shī)句的最終意義, 是指向著你。

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

總結(jié)

以上是生活随笔為你收集整理的[SDOI2006] 保安站岗的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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