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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

【Uva 12093】Protecting Zonk

發布時間:2023/12/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Uva 12093】Protecting Zonk 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Link:

Description

n個節點的樹;
每個節點都可以選擇3種
1.覆蓋和它相連的邊; c1花費;
2.覆蓋和它相連的邊以及和它相連的點相連的邊; c2花費;
3.不進行操作
覆蓋所有的邊的最小花費;

Solution

/*n個節點的樹;每個節點都可以選擇兩種1.覆蓋和它相連的邊; c1花費;2.覆蓋和它相連的邊以及和它相連的點相連的邊; c2花費;覆蓋所有的邊的花費;g[i][3]表示i節點以下的邊都被覆蓋的最小花費,i不放,上面一條邊有沒有被覆蓋,0沒,1有2表示i可能和它的子樹有一個沒連上,i不放的最小花費(當然此時i上面沒有邊);{多定義g[i][2]這個狀態,是因為可能i節點放了個2,然后{兒子的兒子}和{兒子}沒連;這時在i放一個2也是可以的}f[i][1]...,i放一個1f[i][2]...,i放一個2葉子節點ig[i][0] = 0,g[i][1] = INF,f[i][1] = c1,f[i][2] = c2;非葉子節點ig[i][0]每個子樹sonj;{g[sonj][1];f[sonj][1];}g[i][1]每個子樹sonj{//肯定要一個f[][2]則其他所有兒子都能連上了tmep1 = min(f[sonj][1],f[sonj][2],g[sonj][1],g[sonj][0]);min{f[sonj][2]-temp1}}g[i][2] -- i可能和它的子樹有一個沒連上?{{g[sonj][0..1],f[sonj][1],f[sonj][2]}}f[i][1]每個子樹sonj{{g[sonj][0..1],f[sonj][1],f[sonj][2]} + c1}f[i][2]每個子樹sonj{{g[sonj][0..2],f[sonj][1],f[sonj][2]} + c2;} */


NumberOf WA

0

Reviw

樹形DP多想想,感覺不是那么難.

Code

#include <bits/stdc++.h> using namespace std; #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define LL long long #define rep1(i,a,b) for (int i = a;i <= b;i++) #define rep2(i,a,b) for (int i = a;i >= b;i--) #define mp make_pair #define pb push_back #define fi first #define se second #define ms(x,y) memset(x,y,sizeof x) #define ri(x) scanf("%d",&x) #define rl(x) scanf("%lld",&x) #define rs(x) scanf("%s",x+1) #define oi(x) printf("%d",x) #define ol(x) printf("%lld",x) #define oc putchar(' ') #define all(x) x.begin(),x.end() #define Open() freopen("F:\\rush.txt","r",stdin) #define Close() ios::sync_with_stdio(0)typedef pair<int,int> pii; typedef pair<LL,LL> pll;const int dx[9] = {0,1,-1,0,0,-1,-1,1,1}; const int dy[9] = {0,0,0,-1,1,-1,1,-1,1}; const double pi = acos(-1.0); const int N = 1e4; const int INF = 0x3f3f3f3f;int n,c1,c2,g[N+10][3],f[N+10][3]; vector <int> G[N+10];void dfs(int x,int fa){if (x!=1 && (int) G[x].size()==1){g[x][0] = 0,g[x][1] = INF,f[x][1] = c1,f[x][2] = c2;g[x][2] = INF;return;}int len = G[x].size();g[x][0] = 0;rep1(i,0,len-1){int y = G[x][i];if (y==fa) continue;dfs(y,x);g[x][0] += min(g[y][1],f[y][1]);}g[x][1] = 0;int t = INF;f[x][1] = c1,f[x][2] = c2,g[x][2] = 0;rep1(i,0,len-1){int y = G[x][i],temp1;if (y==fa) continue;temp1 = min(f[y][1],f[y][2]);temp1 = min(temp1,g[y][1]);temp1 = min(temp1,g[y][0]);g[x][1] += temp1;t = min(t,f[y][2]-temp1);f[x][1] += temp1;g[x][2] += temp1;temp1 = min(temp1,g[y][2]);f[x][2] += temp1;}g[x][1] += t; }int main(){//Open();//Close();while (~ri(n)){ri(c1),ri(c2);if (n==0) break;rep1(i,1,n) G[i].clear();rep1(i,1,n-1){int x,y;ri(x),ri(y);G[x].pb(y),G[y].pb(x);}dfs(1,0);int ans = min(g[1][0],g[1][1]);ans = min(ans,f[1][1]),ans = min(ans,f[1][2]);oi(ans);puts("");}return 0; }

轉載于:https://www.cnblogs.com/AWCXV/p/7626136.html

總結

以上是生活随笔為你收集整理的【Uva 12093】Protecting Zonk的全部內容,希望文章能夠幫你解決所遇到的問題。

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