题目链接: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 }