2020牛客国庆集训派对day1 C. Bob in Wonderland
生活随笔
收集整理的這篇文章主要介紹了
2020牛客国庆集训派对day1 C. Bob in Wonderland
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Bob in Wonderland
題意:
一棵樹,問最少移動多少次邊可以使其變成一個鏈?
移動是指:從原位置拆下并連到新位置,這樣算一次
題解:
錯誤思路
我一開始在想既然求最少移動次數,那我們就盡可能在原本的就存在的鏈的基礎上進行修改,也就是先找樹中最長的鏈(即樹的直徑),然后看這條鏈上有多少子鏈相連,拆下來再連上即可,所以先跑兩邊dfs,求出最長直徑,并記錄直徑上的點,然后依次查看直徑上的點的度數是否大于2,如果大于2就說明除了前后兩個點,還有其他點相連,注意如果7連在6上,然后6連在直徑上,那6和7是算一個整體的,所以只需要查看直徑點的度數即可
正確思路
但是。。代碼就是wa。。。感覺是兩邊dfs不對???
我也很懵逼,后來又想了想,其實完全沒這么復雜,因為沒有必要先求直徑,我們直接求所有點的度數,然后查看度數是否大于等于2,并累加即可
而且,如果鏈的上面存在鏈怎么辦?也就是7連著6,6連著5,5連著直徑上一點,但是6還連接著其他鏈,這樣我們只查看直徑上的點就不對了,應該是查看所有度數大于2的點
先求樹的直徑純屬畫蛇添足,因為如果所有點組成鏈,那么所有點的度數必然小于等于2(兩端等于1,中間等于2),所以直接查看所有點度數就行
代碼:
#include<bits/stdc++.h> using namespace std; const int maxn=6e5+9; vector<int>G[maxn]; int main() {int n;cin>>n;for(int i=1;i<n;i++){int x,y;cin>>x>>y;G[x].push_back(y);G[y].push_back(x);}int sum=0;for(int i=1;i<=n;i++){int w=G[i].size()-2;if(w>0){sum+=w; }}cout<<sum<<endl;return 0; }總結
以上是生活随笔為你收集整理的2020牛客国庆集训派对day1 C. Bob in Wonderland的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: VR头显价格天差地别,究竟哪一款最适合你
- 下一篇: 2020牛客国庆集训派对day1 Zel