DFSして数える.
dfs(cu){
頂点に入るときの処理
for(ne in to[cu]){
次の頂点に遷移する辺に関する処理 dfs(ne)
前の頂点に戻るときの辺に関する処理 }
頂点から出るときの処理
}
が基本形.
あとは,ループや多重辺に注意.
使っている記号,マクロ等 "https://ecsmtlir.hatenablog.com/entry/2022/12/23/131925"
int main() {
ll n,m; cin >> n >> m;
vvll to(n);
rep(i,m){
ll a, b; cin >> a >> b;
--a, --b;
to[a].push_back(b);
to[b].push_back(a);
}
vll vis(n);
ll cv = 0, ce = 0;
if(vis[cu]){
return ;
}
vis[cu] = true;
cv ++;
ce++;
f(f, ne, cu);
}
};
rep(i,n) if(!vis[i]){
cv = 0;
ce = 0;
dfs(dfs, i);
if(cv != ce/2){
cout << "No" << endl;
return 0;
}
}
cout << "Yes" << endl;
return 0;
}