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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

Cover the Tree(2020多校第二场C)

發(fā)布時間:2023/12/3 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Cover the Tree(2020多校第二场C) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Cover the Tree

文章目錄

    • 題意:
    • 題解:
    • 代碼

題意:

一個無向樹,選擇最少數(shù)量的鏈子,能將樹上所有邊覆蓋,答案不唯一
(1≤n≤2×105
鏈子就是兩點之間的邊
看看樣例
輸入

5 1 2 1 3 2 4 2 5

輸出

2 2 3 4 5

一種情況如圖所示:
所有邊被覆蓋的鏈子有:
鏈子2->3:覆蓋了邊1-2,1-3
鏈子4->5:覆蓋了邊4-2,2-5

題解:


上述文字看不懂也沒關(guān)系,我也不大懂,我結(jié)合題解談?wù)勎业恼J(rèn)識
所用知識:
dfs序講解
題目要求我們找鏈,鏈有兩個端點,其實說白了就是在樹上兩兩找點,讓他們匹配,要覆蓋所有邊
如果有x個葉子節(jié)點,那我們最少的子鏈也要是(x/2)向上取整(不然不能覆蓋所有與葉子節(jié)點相連的邊)
我們讓根左子樹的葉節(jié)點和根右子樹的葉節(jié)點一一配對,如果葉節(jié)點是奇數(shù)個的話,再任意找一個節(jié)點與之配對即可。

如果任意葉子節(jié)點匹配
如圖
很容易造成遺漏,比如1——3這條邊就沒有,

所以我們要按照每種特定的順序來實現(xiàn)不遺漏,而且所用鏈不多

我們用dfs序?qū)γ總€點進(jìn)行編號,讓x與x+(n/2)交叉匹配,這樣就不重復(fù)了,
最后跑一遍dfs序,記錄一下葉子節(jié)點出現(xiàn)的位置進(jìn)行輸出

代碼

#include<bits/stdc++.h> #include<vector> using namespace std; const int maxn=2e5+7; vector<int> vec[maxn]; vector<int>sum; void dfs(int x,int pre) { if(vec[x].size()==1)sum.push_back(x);//將每個葉子節(jié)點存放入 for(auto i:vec[x]){if(i==pre)continue;dfs(i,x);} } int main() {int n;cin>>n;for(int i=1;i<n;i++){int u,v;cin>>u>>v;vec[u].push_back(v);vec[v].push_back(u);}int root=1;while(vec[root].size()==1)root++;//我們要選的根節(jié)點不能只連接一個邊dfs(root,-1);//dfs序 int size=sum.size();int ant=(size+1)/2;//另一個點的編號 cout<<ant<<endl;if(size&1)sum.push_back(root);//如果奇數(shù)個點,則將根和多的葉子節(jié)點匹配 for(int i=0;i<ant;i++){cout<<sum[i]<<" "<<sum[i+ant]<<endl;}return 0; }

總結(jié)

以上是生活随笔為你收集整理的Cover the Tree(2020多校第二场C)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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