codeforces 765 E Tree Folding
生活随笔
收集整理的這篇文章主要介紹了
codeforces 765 E Tree Folding
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
傳送門
題意:給你一棵樹,如果有兩條完全相同的鏈存在則可以關于中間進行折疊,即合成一條鏈,問你最后剩下的最少的邊有多少。不能合并則輸出-1
題解:dfs處理,對每一個節點開一個set記錄兒子鏈的長度,如果只有一種長度(可能出現兩種情況,一種就是有多條鏈,但是長度都相同,或者只有一條鏈但是他們不管是合并還是留下來長度都是這個長度)因此則直接合并返回該長度,如果沒有長度,說明dfs到底了返回0,如果有兩種長度,這時就要記錄下來這個位置,再dfs一次,因為該節點的父親節點之上的鏈可能能夠與該節點中的某一條鏈合并。如果有兩種以上長度則直接-1
Copy #include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <map> #include <queue> #include <vector> #include <cstring> #include <iomanip> #include <set> #include<ctime> #include<unordered_map> //CLOCKS_PER_SEC #define se second #define fi first #define ll long long #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define Pii pair<int,int> #define Pli pair<ll,int> #define ull unsigned long long #define pb push_back #define fio ios::sync_with_stdio(false);cin.tie(0) const int N=1e6+10; const ull base=163; const int INF=0x3f3f3f3f; using namespace std; vector<int>vec[N]; int root=-1; int dfs(int u,int fa){set<int>s;for(auto v:vec[u]){if(v!=fa){int tmp=dfs(v,u);if(tmp==-1)return -1;else s.insert(tmp+1);}}if(s.size()==0)return 0;else if(s.size()==1)return *s.begin();else if(s.size()==2&&fa==0)return *s.begin()+*s.rbegin();else if(s.size()==2&&fa!=0){root=u;return -1;}else return -1; } int main(){int n;scanf("%d",&n);for(int i=1;i<=n-1;i++){int u,v;scanf("%d%d",&u,&v);vec[u].pb(v),vec[v].pb(u);}int ans=dfs(1,0);if(ans==-1&&root!=-1)ans=dfs(root,0);while(ans%2==0)ans/=2;cout<<ans;return 0; }?
轉載于:https://www.cnblogs.com/Mrleon/p/9098935.html
總結
以上是生活随笔為你收集整理的codeforces 765 E Tree Folding的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 下一个游戏新风口已来?小游戏或成2018
- 下一篇: mysql知识积累