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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

SDOI 2006 - 保安站岗

發布時間:2024/4/17 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SDOI 2006 - 保安站岗 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最小監視覆蓋,即選中費用最小的i個點來選中一些邊,這些邊把所有的點覆蓋。

#include <cstdio> using namespace std;#define MAXV 1505 #define MAXE (MAXV - 1) int Vefw[MAXE], Veh[MAXV], Vet[MAXE], Vc[MAXV], Veptr; int dp[MAXV][3],dp2[MAXV];#define min(a,b) ((a)<(b)?(a):(b))#define addedge(s,t) do{\Vefw[Veptr] = Veh[s], Vet[Veptr] = t; \Veh[s] = ++Veptr;}while(0)void solve(int s) {dp[s][2] = 0, dp[s][1] = Vc[s];for(int e = Veh[s]; e; e = Vefw[e]) {int t = Vet[--e];solve(t);dp[s][1] += min(min(dp[t][0], dp[t][1]), dp[t][2]);dp[s][2] += min(dp[t][0], dp[t][1]);}int k;dp2[k=s] = 0x3f3f3f3f;for(int e1 = Veh[s]; e1; e1 = Vefw[e1]) {int t1 = Vet[--e1];dp2[t1] = dp[t1][1];for(int e2 = Veh[s]; e2; e2 = Vefw[e2]) {int t2 = Vet[--e2];if (t2 != t1) dp2[t1] += min(dp[t2][0], dp[t2][1]);}if (dp2[k] > dp2[t1]) k = t1;}dp[s][0] = dp2[k]; }int N;int main(void) { // freopen("sdoi2006_guard.txt", "r", stdin);scanf("%d", &N);int root = 0;for(int i=0; i<N; ++i) {int s, k, c;scanf("%d%d%d", &s, &k, &c);Vc[--s] = k;while(c) {int t;scanf("%d", &t); --t;if (t == root) root = s;addedge(s, t);--c;}}solve(root);printf("%d\n", min(dp[root][0], dp[root][1]));return 0; }

?

1046 Accepted 988 0 C++1421 B2014-05-20 14:36:41

轉載于:https://www.cnblogs.com/e0e1e/p/sdoi2006_guard.html

總結

以上是生活随笔為你收集整理的SDOI 2006 - 保安站岗的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。