1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
|
#include <bits/stdc++.h> #define FOR(i, a, b) for (int i = (a); i <= (b); ++i) #define ROF(i, a, b) for (int i = (a); i >= (b); --i) #define all(x) x.begin(),x.end() #define CLR(i,a) memset(i,a,sizeof(i)) #define fi first #define se second #define pb push_back #define SZ(a) ((int) a.size())
using namespace std;
typedef long long ll; typedef unsigned long long ull; typedef pair<ll,ll> pll; typedef array<ll,3> arr; typedef double DB; typedef pair<DB,DB> pdd; constexpr ll MAXN=static_cast<ll>(2e5)+10,INF=static_cast<ll>(5e18)+3; typedef pair<ll,bool> plb;
ll N,M,T,A[MAXN]; vector<ll> g[MAXN]; ll ans=0; bool vis[MAXN]; ll dp[MAXN];
pair<ll,bool> dfs(ll x){ ll lans=0; bool flag=false; vector<ll> rett; FOR(i,0,SZ(g[x])-1){ ll node=g[x][i]; if(!vis[node]){ vis[node]=true; plb ret=dfs(node); if(ret.se) flag=true; lans+=ret.fi; rett.pb(ret.fi); } } if(SZ(g[x])==4){ lans+=1; ans=max(lans,ans); return (plb){lans,true}; }else if(SZ(g[x])==1){ lans+=1; if(flag) ans=max(lans,ans); return (plb){lans,flag}; }else if(SZ(g[x])<4){ if(flag){ sort(all(rett)); ans=max(ans,1+rett[SZ(rett)-1]); } return (plb){1,false}; }else{ sort(all(rett)); lans=0; ROF(i,SZ(rett)-1,SZ(rett)-3){ lans+=rett[i]; } lans+=1; ans=max(ans,lans+rett[SZ(rett)-4]); return (plb){lans,true}; } }
inline void solve(){ cin>>N; ans=0; FOR(i,1,N-1){ ll a,b; cin>>a>>b; g[a].pb(b); g[b].pb(a); } vis[1]=true; dfs(1); cout<<(ans==0?-1:ans)<<"\n"; }
int main() { ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); solve(); return 0; }
|