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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

2020牛客国庆集训派对day1 C. Bob in Wonderland

發布時間:2023/12/3 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的全部內容,希望文章能夠幫你解決所遇到的問題。

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