E. Bear and Drawing

time limit per test

1 second

memory limit per test

256 megabytes

input

standard input

output

standard output

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.

Is it possible for Limak to draw chosen tree?

Input

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.

Output

Print "Yes" (without the quotes) if Limak can draw chosen tree. Otherwise, print "No" (without the quotes).

Sample test(s)

input

81 21 31 66 46 76 57 8

output

Yes

input

131 21 31 42 52 62 73 83 93 104 114 124 13

output

No

我们想如果一个点 连接着 大于等于两颗树是多叉树的话,那么我们就可以认为这个是无解的(除非其中一颗树是直接连接在该结点上的)。

#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;
}

时间: 2024-11-07 22:09:32

E. Bear and Drawing的相关文章

codeforces 573C 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 -

Codeforces573C. Bear and Drawing

http://codeforces.com/problemset/problem/573/C 给一颗树,问是否能画在两行平行的点格图上(无限长),边长随意,不能相交. #include<bits/stdc++.h> const int maxn=1e5+15; using namespace std; vector<int> g[maxn]; int n,leg[maxn]; bool mark[maxn]; void init(){ scanf("%d",&a

CF573C Bear and Drawing 构造+树论

正解:构造 解题报告: 传送门! 这题首先可以画下图找下规律,,,然后通过找规律可以发现,最终的方案一定是一条主干+一些枝条,而且这些枝条的分杈一定小于等于2 明确一下主干的定义,最左边的节点和最右边的节点之间的路径为主干 如图 强行证明一下吼,,, 因为是两排平行的“钉子板” 所以如果一个分枝点想要有超过2个儿子结点 因为在同侧最多有两条边 就一定要往另一边伸至少一条边 这样就因为这条边挡住了一侧(比如说左侧) 那么剩下的边只能往右侧伸展了 那它向另一侧伸的边伸出的子树中的叶子节点一定有一个是

CF 574E(Bear and Drawing-2*n点阵画树)

E. Bear and Drawing time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Limak is a little bear who learns to draw. People usually start with houses, fences and flowers but why would bears do it

Codeforces掉分记 round318(div2)

Codeforces掉分记 round318(div2) 又升回紫名了233,这一次就差一点点就AK了,还没有AK过. (以下题目描述摘自codeforces) A题 Bear and Elections 题目描述 Limak is a grizzly bear who desires power and adoration. He wants to win in upcoming elections and rule over the Bearland. There are n candida

Codeforces Round #318(Div 1) 573A, 573B,573C

转载请注明出处: http://www.cnblogs.com/fraud/          ——by fraud 这场的前两题完全是手速题...A题写了7分钟,交的时候已经500+了,好在B题出的速度勉强凑活吧,and C题也没有FST A. Bear and Poker Limak is an old brown bear. He often plays poker with his friends. Today they went to a casino. There are n pla

CodeForce 680B - Bear and Finding Criminals

Bear and Finding Criminals There are n cities in Bearland, numbered 1 through n. Cities are arranged in one long row. The distance between cities i and j is equal to |i - j|. Limak is a police officer. He lives in a city a. His job is to catch crimin

codeforces 653B B. Bear and Compressing(dfs)

题目链接: B. Bear and Compressing time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Limak is a little polar bear. Polar bears hate long strings and thus they like to compress them. You should al

codeforces 653A A. Bear and Three Balls(水题)

题目链接: A. Bear and Three Balls time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Limak is a little polar bear. He has n balls, the i-th ball has size ti. Limak wants to give one ball to each