hdu4714 Tree2cycle 把树剪成链
題目是問把一棵樹通過剪邊、加邊形成一個(gè)環(huán)的最小代價(jià)。
分成兩步,先把樹剪成一些鏈,再把鏈連接成一個(gè)環(huán)。
設(shè)一棵有n個(gè)節(jié)點(diǎn)的樹,剪掉X條邊后,形成L條鏈。
那么代價(jià)為X+L。
n-1-X=edgeNum(L條鏈) ① //原本有n-1條邊,剪掉X條,還剩edgeNum(L條鏈)條
edgeNum(L條鏈)+L=n ② //L條鏈的這些邊+L條邊形成一個(gè)有n條邊的環(huán)
由①、②得到,L=X+1
則代價(jià)為 X+L=2*L-1=2*X+1。
問題轉(zhuǎn)化成了,把一棵樹剪成一些鏈,最少能剪成幾條鏈?或者,最少需要剪掉多少條邊?
我覺得到了這一步問題就好解決了,我是樹形dp搞的,求的是最少能剪成幾條鏈。
dp[u][0]表示u節(jié)點(diǎn)是所在鏈的端點(diǎn)時(shí),以u(píng)節(jié)點(diǎn)為根節(jié)點(diǎn)的子樹形成的最少的鏈數(shù)。
dp[u][1]表示u節(jié)點(diǎn)是所在鏈的中間的點(diǎn)時(shí),以u(píng)節(jié)點(diǎn)為根節(jié)點(diǎn)的子樹形成的最少的鏈數(shù)。
然后就可以轉(zhuǎn)移了。
1 #include<cstdio> 2 #include<cstring> 3 #include<vector> 4 #pragma comment(linker, "/STACK:102400000,102400000") 5 using namespace std; 6 const int N = 1000005; 7 const int inf = N; 8 9 vector<int> G[N]; 10 int dp[N][2]; 11 12 inline int min(int a,int b) {return a<b?a:b;} 13 14 void dfs(int u,int fa) 15 { 16 int sz = G[u].size(); 17 int v,cld=0,sum=0,min1=inf,min2=inf,temp; 18 for(int i=0;i<sz;i++) 19 { 20 v = G[u][i]; 21 if( v!=fa ) 22 { 23 cld++; 24 dfs(v,u); 25 temp = min(dp[v][0],dp[v][1]); 26 sum += temp; 27 temp = dp[v][0] - temp; 28 if( temp<min1 ) {min2=min1;min1=temp;} 29 else if( temp<min2 ) min2=temp; 30 } 31 } 32 if( !cld ) dp[u][0]=1,dp[u][1]=inf; 33 else if( 1==cld ) dp[u][0]=sum+min1,dp[u][1]=inf; 34 else 35 { 36 dp[u][0] = sum + min1; 37 dp[u][1] = sum + min1 + min2 - 1; 38 } 39 } 40 41 int main() 42 { 43 int T; 44 int n,u,v; 45 46 //freopen("4714.in","r",stdin); 47 //freopen("myout.txt","w",stdout); 48 scanf("%d",&T); 49 while( T-- ) 50 { 51 scanf("%d",&n); 52 for(int i=1;i<=n;i++) G[i].clear(); 53 for(int i=0;i<n-1;i++) 54 { 55 scanf("%d%d",&u,&v); 56 G[u].push_back(v); 57 G[v].push_back(u); 58 } 59 dfs(1,0); 60 printf("%d\n",2*min(dp[1][0],dp[1][1])-1); 61 } 62 return 0; 63 } View Code?
?
轉(zhuǎn)載于:https://www.cnblogs.com/kiwi-bird/p/3310970.html
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)總結(jié)
以上是生活随笔為你收集整理的hdu4714 Tree2cycle 把树剪成链的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring.net学习记录
- 下一篇: MIUI12.5安装ca证书提示失败