AtCoder Grand Contest 014 B - Unplanned Queries

B - Unplanned Queries


Time limit : 2sec / Memory limit : 256MB

Score : 500 points

Problem Statement

Takahashi is not good at problems about trees in programming contests, and Aoki is helping him practice.

First, Takahashi created a tree with N vertices numbered 1 through N, and wrote 0 at each edge.

Then, Aoki gave him M queries. The i-th of them is as follows:

  • Increment the number written at each edge along the path connecting vertices ai and bi, by one.

After Takahashi executed all of the queries, he told Aoki that, for every edge, the written number became an even number. However, Aoki forgot to confirm that the graph Takahashi created was actually a tree, and it is possible that Takahashi made a mistake in creating a tree or executing queries.

Determine whether there exists a tree that has the property mentioned by Takahashi.

Constraints

  • 2≤N≤105
  • 1≤M≤105
  • 1≤ai,biN
  • aibi

Input

Input is given from Standard Input in the following format:

N M
a1 b1
:
aM bM

Output

Print YES if there exists a tree that has the property mentioned by Takahashi; print NO otherwise.


Sample Input 1

Copy
4 4
1 2
2 4
1 3
3 4

Sample Output 1

Copy
YES

For example, Takahashi's graph has the property mentioned by him if it has the following edges: 1−21−3 and 1−4. In this case, the number written at every edge will become 2.


Sample Input 2

Copy
5 5
1 2
3 5
5 1
3 4
2 3

Sample Output 2

Copy
NO

如果成立那么树的叶子节点的的度必定为偶数,那么删掉所有叶子节点和连接叶子节点的边,又是一个树,同理可得到树的所有节点的必定被提到偶数次
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<algorithm>
#include<iostream>
#include<queue>
#include<map>
#include<cmath>
#include<set>
#include<stack>
#define ll long long
#define pb push_back
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)>(y)?(y):(x))
#define cls(name,x) memset(name,x,sizeof(name))
using namespace std;
const int inf=1e9+10;
const ll llinf=1e16+10;
const int maxn=1e5+10;
const int maxm=1e2+10;
const int mod=1e9+7;
int n,m;
int c[maxn];
int main()
{
    //freopen("in.txt","r",stdin);
    while(~scanf("%d %d",&n,&m))
    {
        for(int i=1;i<=m;i++)
        {
            int a,b;
            scanf("%d %d",&a,&b);
            c[a]++;
            c[b]++;
        }
        int flag=1;
        for(int i=1;i<=n;i++)
        {
            if(c[i]%2==1)
                flag=0;
        }
        if(flag) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}

 



转载于:https://www.cnblogs.com/mgz-/p/7136084.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值