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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

洛谷P3155:叶子的染色(树形dp)

發(fā)布時(shí)間:2023/12/3 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 洛谷P3155:叶子的染色(树形dp) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

解析

本題的關(guān)鍵是選取哪一個(gè)根對答案沒有影響
還有一個(gè)重要的性質(zhì)是:根節(jié)點(diǎn)必定涂色
這點(diǎn)對每棵子樹作為獨(dú)立的子問題時(shí)依然成立
然鵝我完全沒有看到上面那倆性質(zhì)
直接暴力設(shè)計(jì)dp狀態(tài)0.、1、2 開始莽
然后?然后就T了啊…
只好開始考慮換根
然后?然后就WA了啊…
最后捯飭到第四交才過
qwq

有一點(diǎn)可貴是忍住了沒看LOJ的數(shù)據(jù)吧

看到題不要被它的描述迷惑
先想想有啥性質(zhì)
先好好想清楚性質(zhì)再敲,不要硬用min交給代碼莽!
(盡管最后莽出來了)

代碼

其實(shí)不用換根但是換都換了不貼太可惜了

#include<bits/stdc++.h> using namespace std; #define ll long long const int N=1e5+100; const double eps=1e-6; inline ll read() {ll x=0,f=1;char c=getchar();while(!isdigit(c)) {if(c=='-')f=-1;c=getchar();}while(isdigit(c)) {x=(x<<1)+(x<<3)+c-'0';c=getchar();}return f*x; } int n,m,k; struct node{int to,nxt; }p[N<<1]; int fi[N],cnt=-1; inline void addline(int x,int y){p[++cnt]=(node){y,fi[x]};fi[x]=cnt; } int dp[N][3],c[N],up[N][3]; void dfs1(int x,int f){if(x<=m){dp[x][c[x]]=0;dp[x][3-c[x]]=2e4;dp[x][0]=1;return;}dp[x][0]=dp[x][1]=dp[x][2]=0;for(int i=fi[x];~i;i=p[i].nxt){int to=p[i].to;if(to==f) continue;dfs1(to,x);dp[x][0]+=dp[to][0];dp[x][1]+=min(dp[to][0],dp[to][1]);dp[x][2]+=min(dp[to][0],dp[to][2]);}dp[x][0]=min(dp[x][0],min(dp[x][1],dp[x][2])+1);return; } void dfs2(int x,int f){if(f){up[x][0]=up[f][0]+dp[f][0]-min(dp[x][1],dp[x][2])-1;up[x][1]=min(up[f][0],up[f][1])+dp[f][1]-min(dp[x][0],dp[x][1]);up[x][2]=min(up[f][0],up[f][2])+dp[f][2]-min(dp[x][0],dp[x][2]);}for(int i=fi[x];~i;i=p[i].nxt){int to=p[i].to;if(to==f) continue;dfs2(to,x);}return; } int ans=2e9; int main(){memset(fi,-1,sizeof(fi));cnt=-1;n=read();m=read();for(int i=1;i<=m;i++) c[i]=read(),c[i]++;for(int i=1;i<n;i++){int x=read(),y=read();addline(x,y);addline(y,x);}dfs1(m+1,0);dfs2(m+1,0);for(int i=m+1;i<=n;i++){//printf("i=%d dp=%d up=%d\n",i,dp[i][0],up[i][0]);ans=min(ans,dp[i][0]+up[i][0]);}printf("%d\n",ans); } /* 8 6 1 1 0 1 1 0 1 7 2 7 3 7 7 8 4 8 5 8 6 8 */

總結(jié)

以上是生活随笔為你收集整理的洛谷P3155:叶子的染色(树形dp)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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