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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

CF685B Kay and Snowflake

發(fā)布時間:2023/12/20 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CF685B Kay and Snowflake 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

CF685B Kay and Snowflake

題意:輸入一棵樹,判斷每一棵子樹的重心是哪一個節(jié)點.

題解:
首先關于重心:一棵樹將某個點去掉,會把這棵樹分為好幾塊,以最大的一塊的結點個數作為maxsizemaxsizemaxsize,這樣的話每一個點都對應著一個maxsizemaxsizemaxsize,這些值當中最小的那個所對應的結點即為樹的重心。

定義:Gson[i]Gson[i]Gson[i]表示以 iii為根的子樹中 sizesizesize最大的子樹
性質:
1.若xxx為根節(jié)點,這顆子樹的重心一定在根節(jié)點xxx上或者是 從 xxx到以Gson[x]的重心的路徑上。
2.一個樹的重心的depdepdep一定小于等于它的子樹的重心。
3.如果一個Gson[x]Gson[x]Gson[x]sizesizesize222大于xxxsizesizesize,那么重心一定在Gson[x]Gson[x]Gson[x]的子樹里。

//***************樹的重心 #include<bits/stdc++.h> #define mp make_pair #define se second #define fi first using namespace std;typedef long long ll; typedef pair<int, int> pii; typedef pair<ll, int> pli; typedef pair<ll, ll> pll; typedef long double ld;const int N=2e4+10; const int maxn=300010; const int INF=0x3f3f3f3f; const double eps=0.0000001; const ll mod=998244353; int n,m,x,y,z,k,cnt,t,len,q;vector<int>G[maxn]; int son[maxn];//然后設son[i]表示以i為根的子樹的節(jié)點個數(不包括根) int Gson[maxn];//重兒子 //int ans,balance;//ans重心 balance平衡最大子樹的最小節(jié)點 int ans[maxn];//儲存質心的節(jié)點 int fa[maxn];void ReadTree() {//輸入n-1條邊for(int i=2;i<=n;i++){int s,e;scanf("%d",&fa[i]);e=i;G[fa[i]].push_back(e);G[e].push_back(fa[i]);} } void dfs(int u,int fat) {//O(n)搜一遍即可son[u]=1;int d=G[u].size();int pre_balance=0;for(int i=0;i<d;i++){int v=G[u][i];if(v!=fat){dfs(v,u);son[u]+=son[v];//合并子樹int k=v;//更新重兒子if(son[k]>son[Gson[u]]) Gson[u]=k;}}int k;if(son[Gson[u]]*2>son[u]){//如果這個兒子的結點數超過整個的兩倍k=ans[Gson[u]];//應用結論根節(jié)點的質心的dep小于子樹的質心//找到第一個沒超過兩倍的子樹根節(jié)點//不斷向上跳while((son[u]-son[k])*2>son[u])k=fa[k];ans[u]=k;//以它的節(jié)點為質心}else{ans[u]=u;}return ;}//scanf("%lld%lld",&n,&m);//printf("%lld\n",ans);//for(int i=1;i<=n;i++) int main() {scanf("%d%d",&n,&m);ReadTree();memset(son,0,sizeof(son)); // ans=0;balance=INF;dfs(1,-1);for(int i=1;i<=m;i++){int x;scanf("%d",&x);printf("%d\n",ans[x]);}return 0; }

總結

以上是生活随笔為你收集整理的CF685B Kay and Snowflake的全部內容,希望文章能夠幫你解決所遇到的問題。

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