国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Codeforces Round #397 E. Tree Fold(bfs,想法題,好題)

2019-11-08 02:32:11
字體:
來源:轉載
供稿:網友

題目鏈接E. Tree Foldingtime limit per test2 secondsmemory limit per test512 megabytesinputstandard inputoutputstandard output

Vanya wants to minimize a tree. He can perform the following Operation multiple times: choose a vertex v, and two disjoint (except for v) paths of equal length a0?=?va1, ..., ak, and b0?=?vb1, ..., bk. Additionally, vertices a1, ..., akb1, ..., bk must not have any neighbours in the tree other than adjacent vertices of corresponding paths. After that, one of the paths may be merged into the other, that is, the vertices b1, ..., bk can be effectively erased:

Help Vanya determine if it possible to make the tree into a path via a sequence of described operations, and if the answer is positive, also determine the shortest length of such path.

Input

The first line of input contains the number of vertices n (2?≤?n?≤?2·105).

Next n?-?1 lines describe edges of the tree. Each of these lines contains two space-separated integers u and v (1?≤?u,?v?≤?nu?≠?v) — indices of endpoints of the corresponding edge. It is guaranteed that the given graph is a tree.

Output

If it is impossible to obtain a path, PRint -1. Otherwise, print the minimum number of edges in a possible path.

Examplesinput
61 22 32 44 51 6output
3input
71 21 33 41 55 66 7output
-1Note

In the first sample case, a path of three edges is obtained after merging paths 2?-?1?-?6 and 2?-?4?-?5.

It is impossible to perform any operation in the second sample case. For example, it is impossible to merge paths 1?-?3?-?4 and 1?-?5?-?6, since vertex 6 additionally has a neighbour 7 that is not present in the corresponding path.

題意:

給一棵樹,如果兩條鏈,像上面一樣,a[i]和b[i]都沒有鄰居,就可以合并它們,問最后能不能合并成一條鏈,且要求鏈長度最小

題解:

從葉子節點bfs,對于每一個節點用set保存從他下方的節點到這個節點的鏈的長度,如果有相同長度的就會自動“合并”(set的功能)。邊bfs邊刪邊,不斷取葉子結點進行向上縮。

詳見代碼

#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<vector>#include<queue>#include<stack>#include<set>using namespace std;#define rep(i,a,n) for (int i=a;i<n;i++)#define per(i,a,n) for (int i=n-1;i>=a;i--)#define pb push_back#define fi first#define se secondtypedef vector<int> VI;typedef long long ll;typedef pair<int,int> PII;const int inf=0x3fffffff;const ll mod=1000000007;const int maxn=2e5+100;set<int> g[maxn];set<int> d[maxn];queue<int> q;int vis[maxn];int re(int x){    while(x%2==0)        x/=2;    return x;}int solve(){    while(!q.empty())    {        int u=q.front();        q.pop();        if(vis[u]) continue;        if(g[u].size()==1)        {            if(d[u].size()==1)            {                int v=*g[u].begin();                if(vis[v]) continue;                g[u].erase(v),g[v].erase(u);                d[v].insert(*d[u].begin()+1);                if(g[v].size()<=1)                q.push(v);                vis[u]=1;            }        }        else if(g[u].size()==0)        {            if(d[u].size()>=3) return -1;            else if(d[u].size()==2)                return re(*d[u].begin()+*d[u].rbegin());            else return re(*d[u].begin());        }    }    return -1;}int main(){    int n;    scanf("%d",&n);    rep(i,1,n)    {        int u,v;        scanf("%d%d",&u,&v);        g[u].insert(v),g[v].insert(u);    }    rep(i,1,n+1) if(g[i].size()==1) q.push(i),d[i].insert(0);    memset(vis,0,sizeof(vis));    printf("%d/n",solve());    return 0;}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 元谋县| 安福县| 叙永县| 长治市| 大名县| 崇州市| 潮州市| 海原县| 长沙市| 运城市| 双牌县| 贵德县| 阜阳市| 平远县| 博湖县| 元阳县| 柳州市| 丹江口市| 潮州市| 巴林右旗| 西青区| 宁化县| 甘德县| 鹤岗市| 托克逊县| 武功县| 梧州市| 东光县| 乌恰县| 房产| 廉江市| 栖霞市| 天等县| 湘乡市| 内乡县| 扎鲁特旗| 新安县| 泸水县| 本溪市| 泸定县| 峡江县|