Codeforces 765 E. Tree Folding

题目链接:http://codeforces.com/problemset/problem/765/E


 

$DFS子$树进行$DP$

大概分以下几种情况:

  1.为叶子,直接返回。

  2.长度不同的路径长度只有一条,显然可以合并成这一条的长度。

  3.长度不同的路径长度有两条,并且这个点为根,显然可以合并成这两条的长度和。

  4.其他的都不合法。

注意:事实上如果第一次$DP$之后不合法要考虑换根再做一次


 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<vector>
 5 #include<cstdlib>
 6 #include<set>
 7 #include<cmath>
 8 #include<cstring>
 9 using namespace std;
10 #define maxn 1001000
11 #define llg long long 
12 #define yyj(a) freopen(a".in","r",stdin),freopen(a".out","w",stdout);
13 llg n,m,root;
14 vector<llg>a[maxn];
15 
16 inline int getint()
17 {
18        int w=0,q=0; char c=getchar();
19        while((c<'0' || c>'9') && c!='-') c=getchar(); if(c=='-') q=1,c=getchar(); 
20        while (c>='0' && c<='9') w=w*10+c-'0', c=getchar(); return q ? -w : w;
21 }
22 
23 void init()
24 {
25     llg x,y;
26     cin>>n;
27     for (llg i=1;i<n;i++)
28     {
29         x=getint(),y=getint();
30         a[x].push_back(y),a[y].push_back(x);
31     }
32 }
33 
34 llg dfs(llg x,llg fa)
35 {
36     set<llg>s;
37     llg w=a[x].size(),v;
38     for (llg i=0;i<w;i++)
39     {
40         v=a[x][i];
41         if (v==fa) continue;
42         llg val=dfs(v,x);
43         if (val==-1) return val;
44         s.insert(val+1);
45     }
46     if (s.size()==1) return *s.begin();
47     if (s.size()==0) return 0;
48     if (s.size()==2)
49     {
50         if (fa) {root=x; return -1;}
51         return *s.begin()+*s.rbegin();
52     }
53     return -1;
54 }
55 
56 int main()
57 {
58     yyj("tree");
59     init();
60     llg ans=dfs(1,0);
61     if (ans==-1 && root) ans=dfs(root,0);
62     while (ans%2==0) ans/=2;
63     cout<<ans;
64     return 0;
65 }

 

转载于:https://www.cnblogs.com/Dragon-Light/p/6582694.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值