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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

P1272 重建道路

發布時間:2025/3/15 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P1272 重建道路 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  一開始狀態定義錯了……所以沒有對qwq,以及有幾個坑qwq……

  首先 f [ i ] [ j ] 表示以 i 為根的子樹,切除 j 個節點所需要切除的最小邊數,而我一開始定義的是表示以 i 為根的子樹,切除后生成一顆有 j 個節點的子樹,所需要切除的最小邊數。

  為什么我的不行吶?因為對于一個新的子節點更新狀態,它能生成多大的子樹其實是和父親節點是沒有關系的,即它與父親節點原來的狀態無關也,兩棵樹不也連通,然而對于切除多少點,我們在意的是切除后剩的,而不是切除的。那么最后的ans就是 f [ ... ]?[ num - p ] + f [?... ] [?num [ ...?] ]了。?

  以及,根節點的?f [ ] num是0,因為它沒有父親節點本身就是一顆含有 num 個點的(子)樹。

  代碼如下:

#include<cstdio> #include<iostream> #include<cstring> #include<algorithm> using namespace std; #define maxn 2000 struct node {int to,nxt; } edge[maxn]; int f[maxn][maxn],num[maxn],head[maxn]; int n,p,cnt,ans=999999999; void add(int a,int b) {edge[++cnt].to=b;edge[cnt].nxt=head[a];head[a]=cnt; } void dfs(int u,int fa) {num[u]=1;for(int i=head[u]; i; i=edge[i].nxt){int tot=0,am=0;int v=edge[i].to;if(v==fa) continue;dfs(v,u);num[u]+=num[v];f[u][num[v]]=1;am+=num[v];f[u][am]=++tot;}f[u][num[u]]=1;f[u][0]=0;if(u==1) f[u][num[u]]=0; } void dp(int u,int fa) {for(int i=head[u]; i; i=edge[i].nxt){int v=edge[i].to;if(v==fa) continue;dp(v,u);for(int j=num[u]; j>=0; j--)for(int k=0; k<=j; k++)f[u][j]=min(f[u][j],f[u][j-k]+f[v][k]);}if(num[u]>=p)ans=min(ans,f[u][num[u]-p]+f[u][num[u]]); } int main() {memset(f,0x3f3f3f3f,sizeof(f));scanf("%d%d",&n,&p);for(int i=1; i<n; i++){int x,y;scanf("%d%d",&x,&y);add(x,y);add(y,x);}dfs(1,0);dp(1,0);printf("%d",ans);return 0; }

?

轉載于:https://www.cnblogs.com/popo-black-cat/p/10337025.html

總結

以上是生活随笔為你收集整理的P1272 重建道路的全部內容,希望文章能夠幫你解決所遇到的問題。

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