考え方
UnionFind木(
UnionFind木 - 競プロはじめました)で辺で結ばれる頂点をマージする.辺の数は,UnionFind木の親に対応付けて管理する.
回答例
N, M = map(int, input().split())
E = []
for _ in range(M):
u, v = map(int, input().split())
u -= 1
v -= 1
E.append((u, v))
p = [-1] * (N + 1)
def root(x):
if p[x] < 0:
return x
p[x] = root(p[x])
return p[x]
def unite(x, y):
x = root(x)
y = root(y)
if x == y:
return
p[x] += p[y]
p[y] = x
def size(x):
x = root(x)
return -p[x]
cnt = [0] * N
for u, v in E:
unite(u, v)
cnt[u] += 1
num = [0] * N
for i in range(N):
num[root(i)] += cnt[i]
for i in range(N):
if num[root(i)] != size(i):
exit(print('No'))
print('Yes')