#include #include using namespace std; class UnionFind { private: vector par, size; public: UnionFind (int N) { par.resize(N); size.resize(N); for (int i = 0; i < N; i++) { par[i] = i; size[i] = 1; } } int root (int u) { if (par[u] == u) return u; return par[u] = root(par[u]); } void unite (int u, int v) { int l = root(u); int s = root(v); if (l == s) return; if (size[l] < size[s]) swap(l, s); size[l] += size[s]; par[s] = l; } bool same (int u, int v) { return root(u) == root(v); } int groupsize (int u) { return size[u]; } }; int main () { // 余るのは常に連結成分数の端数だけ -> UF int N, M; cin >> N >> M; UnionFind UF(2*N); for (int i = 0; i < M; i++) { int A, B; cin >> A >> B; A--, B--; UF.unite(A, B); } int ans = 0; for (int i = 0; i < 2*N; i++) { if (UF.root(i) == i) ans += UF.groupsize(i) % 2; } ans /= 2; cout << ans << "\n"; }