/*Check if a given graph is a tree */
#include <bits/stdc++.h>
using namespace std;
#define MAX_V 10000
#define MAX_A 20000
typedef struct
{
int v; // vértice adjacente
} TAdj;
vector<TAdj> adj[MAX_V]; // Lista de adjacência
int grau[MAX_V];
// número de arestas do vértice
void initGrafo(int qtdeVertices)
{
memset(grau, 0, sizeof(grau));
for (int i = 0; i < qtdeVertices; i++)
adj[i].clear();
}
// Cria aresta de a para b, com peso w
void aresta(int a, int b)
{
TAdj aux;
aux.v = b;
grau[a]++;
adj[a].push_back(aux);
aux.v = a;
grau[b]++;
adj[b].push_back(aux);
// Se o grafo for não orientado, também adicionamos a aresta (b, a) com
}
int visitado[MAX_V];
int p[MAX_V];
int ordemVis;
void initDfs()
{
memset(visitado, 0, sizeof(visitado));
memset(p, -1, sizeof(p));
ordemVis = 0;
}
void dfs(int s)
{
visitado[s]++;
for (auto t : adj[s])
{
if (visitado[t.v] == 0)
{
p[t.v] = s;
dfs(t.v);
}
}
}
int main()
{
initDfs();
int n, m;
int u, v;
cin >> n >> m;
initGrafo(n);
if (m == n - 1)
{
bool sai = false;
for (int i = 0; i < m; i++)
{
cin >> u >> v;
aresta(u, v);
}
dfs(u);
for (int i = 1; i <= n && !sai; i++)
{
if (visitado[i] != 1)
{
sai = true;
}
}
sai ? printf("NO\n") : printf("YES\n");
}
else
{
printf("NO\n");
}
return 0;
}
LypDaGVjayBpZiBhIGdpdmVuIGdyYXBoIGlzIGEgdHJlZSAqLwoKI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgTUFYX1YgMTAwMDAKI2RlZmluZSBNQVhfQSAyMDAwMAoKdHlwZWRlZiBzdHJ1Y3QKewogICAgaW50IHY7IC8vIHbDqXJ0aWNlIGFkamFjZW50ZQp9IFRBZGo7Cgp2ZWN0b3I8VEFkaj4gYWRqW01BWF9WXTsgLy8gTGlzdGEgZGUgYWRqYWPDqm5jaWEKCmludCBncmF1W01BWF9WXTsKLy8gbsO6bWVybyBkZSBhcmVzdGFzIGRvIHbDqXJ0aWNlCnZvaWQgaW5pdEdyYWZvKGludCBxdGRlVmVydGljZXMpCnsKICAgIG1lbXNldChncmF1LCAwLCBzaXplb2YoZ3JhdSkpOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBxdGRlVmVydGljZXM7IGkrKykKICAgICAgICBhZGpbaV0uY2xlYXIoKTsKfQoKLy8gQ3JpYSBhcmVzdGEgZGUgYSBwYXJhIGIsIGNvbSBwZXNvIHcKdm9pZCBhcmVzdGEoaW50IGEsIGludCBiKQp7CiAgICBUQWRqIGF1eDsKICAgIGF1eC52ID0gYjsKICAgIGdyYXVbYV0rKzsKICAgIGFkalthXS5wdXNoX2JhY2soYXV4KTsKCiAgICBhdXgudiA9IGE7CiAgICBncmF1W2JdKys7CiAgICBhZGpbYl0ucHVzaF9iYWNrKGF1eCk7CgogICAgLy8gU2UgbyBncmFmbyBmb3IgbsOjbyBvcmllbnRhZG8sIHRhbWLDqW0gYWRpY2lvbmFtb3MgYSBhcmVzdGEgKGIsIGEpIGNvbQp9CgppbnQgdmlzaXRhZG9bTUFYX1ZdOwppbnQgcFtNQVhfVl07CmludCBvcmRlbVZpczsKCnZvaWQgaW5pdERmcygpCnsKICAgIG1lbXNldCh2aXNpdGFkbywgMCwgc2l6ZW9mKHZpc2l0YWRvKSk7CiAgICBtZW1zZXQocCwgLTEsIHNpemVvZihwKSk7CiAgICBvcmRlbVZpcyA9IDA7Cn0KCnZvaWQgZGZzKGludCBzKQp7CiAgICB2aXNpdGFkb1tzXSsrOwogICAgZm9yIChhdXRvIHQgOiBhZGpbc10pCiAgICB7CiAgICAgICAgaWYgKHZpc2l0YWRvW3Qudl0gPT0gMCkKICAgICAgICB7CiAgICAgICAgICAgIHBbdC52XSA9IHM7CiAgICAgICAgICAgIGRmcyh0LnYpOwogICAgICAgIH0KICAgIH0KfQoKaW50IG1haW4oKQp7CgogICAgaW5pdERmcygpOwoKICAgIGludCBuLCBtOwogICAgaW50IHUsIHY7CiAgICBjaW4gPj4gbiA+PiBtOwogICAgaW5pdEdyYWZvKG4pOwogICAgaWYgKG0gPT0gbiAtIDEpCiAgICB7CiAgICAgICAgYm9vbCBzYWkgPSBmYWxzZTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG07IGkrKykKICAgICAgICB7CiAgICAgICAgICAgIGNpbiA+PiB1ID4+IHY7CiAgICAgICAgICAgIGFyZXN0YSh1LCB2KTsKICAgICAgICB9CiAgICAgICAgZGZzKHUpOwogICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG4gJiYgIXNhaTsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHZpc2l0YWRvW2ldICE9IDEpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHNhaSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHNhaSA/IHByaW50ZigiTk9cbiIpIDogcHJpbnRmKCJZRVNcbiIpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHByaW50ZigiTk9cbiIpOwogICAgfQogICAgcmV0dXJuIDA7Cn0=