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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

CodeForces-734E Anton and Tree 树的直径

發(fā)布時間:2025/7/25 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CodeForces-734E Anton and Tree 树的直径 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題目大意:

給定一棵有n個節(jié)點的樹,有黑點白點兩種節(jié)點.
每一次操作可以選擇一個同種顏色的聯(lián)通塊將其染成同一種顏色
現(xiàn)在給定一個初始局面問最少多少步可以讓樹變?yōu)榧兩?

題解:

首先我們拿到這棵樹時先將其縮點
然后我們手中的樹就變成了一棵黑白相間的黑白樹.
那么我們現(xiàn)在就是每次選擇一個節(jié)點使其變色,都會使得這個節(jié)點相鄰的所有節(jié)點合并進(jìn)來.
所以我們找度數(shù)最大的合并就好了啊
我們現(xiàn)在把這棵樹想象成由若干條路徑組成的.
那么我們每次合并都會使某些路徑的長度最多減少2
所以我們可以自然而然地想到一定是樹的直徑花費的操作次數(shù)最大.
所以我們將一棵樹化作一條鏈上面連著許多其他的分支的形式.

手模幾個樣例就話發(fā)現(xiàn)答案實際上是\([\frac{len+1}{2}]\)len為直徑長度.

#include <cstdio> #include <cstring> #include <algorithm> using namespace std; typedef long long ll; inline void read(int &x){x=0;char ch;bool flag = false;while(ch=getchar(),ch<'!');if(ch == '-') ch=getchar(),flag = true;while(x=10*x+ch-'0',ch=getchar(),ch>'!');if(flag) x=-x; } const int maxn = 200010; int belong[maxn],nodecnt; int col[maxn]; struct Graph{struct Edge{int to,next;}G[maxn<<1];int head[maxn],cnt;void add(int u,int v){G[++cnt].to = v;G[cnt].next = head[u];head[u] = cnt;} #define v G[i].tovoid dfs1(int u,int f){if(col[u] != col[f]) belong[u] = ++ nodecnt;else belong[u] = belong[f];for(int i = head[u];i;i=G[i].next){if(v == f) continue;dfs1(v,u);}return ;}int dis[maxn],p;void dfs2(int u,int f){for(int i = head[u];i;i=G[i].next){if(v == f) continue;dis[v] = dis[u] + 1;dfs2(v,u);}if(dis[p] < dis[u]) p = u;} #undef v }g1,g2; int main(){int n;read(n);for(int i=1;i<=n;++i) read(col[i]);for(int i=1,u,v;i<n;++i){read(u);read(v);g1.add(u,v);g1.add(v,u);}belong[1] = ++ nodecnt;g1.dfs1(1,1);for(int u=1;u<=n;++u){for(int i = g1.head[u];i;i=g1.G[i].next){if(belong[g1.G[i].to] != belong[u]){g2.add(belong[u],belong[g1.G[i].to]);}}}g2.dfs2(1,1);int u = g2.p;memset(g2.dis,0,sizeof g2.dis);g2.dfs2(u,u);int ans = (g2.dis[g2.p] + 1)/2;printf("%d\n",ans);return 0; }

轉(zhuǎn)載于:https://www.cnblogs.com/Skyminer/p/6613127.html

總結(jié)

以上是生活随笔為你收集整理的CodeForces-734E Anton and Tree 树的直径的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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