国产探花免费观看_亚洲丰满少妇自慰呻吟_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;}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 尚志市| 新晃| 云浮市| 玛纳斯县| 化德县| 闻喜县| 时尚| 项城市| 绥中县| 尼勒克县| 凌云县| 都匀市| 南通市| 郑州市| 莱州市| 桦川县| 巩留县| 纳雍县| 吉水县| 阿克苏市| 正镶白旗| 滦平县| 柘城县| 阿勒泰市| 灵璧县| 镇原县| 东辽县| 黑龙江省| 运城市| 盐津县| 新巴尔虎右旗| 越西县| 绥江县| 西乡县| 伊宁市| 岑巩县| 泸溪县| 毕节市| 固安县| 清河县| 京山县|