并查集。
可以发现只有奇数环或者是偶数环才会影响到最终结果,因此出现奇数环我们踢掉一个人,出场人数为奇数也要踢掉一个人。因此我们考虑用并查集维护两个点之间的关系,如果他们位于同一个集合之中并且是一个奇数环,那么答案加一就可以了。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std ;

typedef long long LL ;
const int MAXN = 1100 ;
const int MAXM = 1100 ;
const int Inf = 0x7fffffff ;

int N, M, F[MAXN], Num[MAXN], Ans ;

inline int Read() {
    int X = 0, F = 1 ; char ch = getchar() ;
    while (ch > '9' || ch < '0') F = (ch == '-' ? - 1 : 1), ch = getchar() ;
    while (ch >= '0' && ch <= '9') X=(X<<1)+(X<<3)+(ch^48), ch = getchar() ;
    return X * F ;
}

inline int Find(int Now) {
    return (Now == F[Now]) ? F[Now] : F[Now] = Find(F[Now]) ;
}

inline void Union(int X, int Y) {
    int L1 = Find(X), L2 = Find(Y) ;
    if (L1 == L2) {
        if (Num[L1] % 2 == 1) 
            Ans ++ ;
    }
    else F[L1] = L2, Num[L2] += Num[L1] ;
}

int main() {
    N = Read() ; M = Read() ;
    for (int i = 1 ; i <= N ; i ++)
        F[i] = i, Num[i] = 1 ;
    for (int i = 1 ; i <= M ; i ++) {
        int A = Read(), B = Read() ;Union(A, B) ;
    }
    if ((N - Ans) % 2 == 1) Ans ++ ;
    printf("%d", Ans) ; return 0 ;
}