E. Bear and Drawing
Limak is a little bear who learns to draw. People usually start with houses, fences and flowers but why would bears do it? Limak lives in the forest and he decides to draw a tree.
Recall that tree is a connected graph consisting of n vertices and n - 1 edges.
Limak chose a tree with n vertices. He has infinite strip of paper with two parallel rows of dots. Little bear wants to assign vertices of a tree to some n distinct dots on a paper so that edges would intersect only at their endpoints — drawn tree must be planar. Below you can see one of correct drawings for the first sample test.
![](http://codeforces.com/predownloaded/ad/42/ad42c33f5bddba98cd6c55baf10360ad2207814a.png)
Is it possible for Limak to draw chosen tree?
The first line contains single integer n (1 ≤ n ≤ 105).
Next n - 1 lines contain description of a tree. i-th of them contains two space-separated integers ai and bi(1 ≤ ai, bi ≤ n, ai ≠ bi) denoting an edge between vertices ai and bi. It's guaranteed that given description forms a tree.
Print "Yes" (without the quotes) if Limak can draw chosen tree. Otherwise, print "No" (without the quotes).
8
1 2
1 3
1 6
6 4
6 7
6 5
7 8
Yes
13
1 2
1 3
1 4
2 5
2 6
2 7
3 8
3 9
3 10
4 11
4 12
4 13
No
我们想如果一个点 连接着 大于等于两颗树是多叉树的话,那么我们就可以认为这个是无解的(除非其中一颗树是直接连接在该结点上的)。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<cstdio> #include <iostream> #include <string.h> #include <vector> using namespace std; const int maxn = 100000 + 5; vector<int> G[maxn]; int leg[maxn]; bool del[maxn]; void dfs(int cur, int per=-1) { if(G[cur].size()<=2) { del[cur]=true; int siz=G[cur].size(); for(int i=0; i<siz; i++) { int b=G[cur][i]; if(b == per) continue; dfs(b,cur); } } } int main() { int n; while(scanf("%d",&n)==1) { memset(del,false,sizeof(del)); memset(leg,0,sizeof(leg)); for(int i=1; i<=n; i++)G[i].clear(); for(int i=1; i<n; i++) { int a,b; scanf("%d%d",&a,&b); G[a].push_back(b); G[b].push_back(a); } for(int i=1; i<=n; i++) if(G[i].size() ==1 ){ dfs(i); } for(int a=1; a<=n; a++) { int siz=G[a].size(); for(int j = 0; j<siz; j++) { int b=G[a][j]; if(del[b]) { leg[a]=min(leg[a]+1,2); } } } bool falg=true; for(int a=1; a<=n; a++) if(del[a]==false){ int cnt=0; for(int j=0; j<G[a].size(); j++) { int b=G[a][j]; if(del[b]==false&&G[b].size()-leg[b]>1) cnt++; } if(cnt>2){ falg=false; break; } } if(falg)puts("YES"); else puts("NO"); } return 0; }