Language: C++

#include <bits/stdc++.h>
using namespace std;
#define int long long
void read(int &x) {
    int r = 0, ne = 1;
    char c;
    while (c < '0' || c > '9') {
     chtholly2317   if (c == '-')
            ne = -1;
        c = getchar();
    }
    while (c >= '0' && c <= '9') {
        r = r * 10 + c - '0';
        c = getchar();
    }
    x = r * ne;
}
struct Edge {
    /* data */
    int i, nxt;
};
/* 链表 */
int h[100002], tot;
Edge e[200002];
inline void _add(int x, int y) {/*无向边*/
    e[++tot].i = y;
    e[tot].nxt = h[x];
    h[x] = tot;
    e[tot++].i = x;
    e[tot].nxt = h[y];
    h[y] = tot;
}
/* 输入 */
int n, m, x, y;
/* 偶环-求解 */
int s[100002], top, mid;
/* dfs */
bool odd;                             /* 奇环 */
int A, B;                             /* 环两个连接点 */
int w[100002]; /* 点绿色权值(1,-1) */ /* 第二遍扫时存的是子树总权值 */
int k[100002];                        /* 偶环时标记多余边到LCA的点 */
int sum;                              /* 权值总和 */
int ans;                              /* 答案 */
inline void dfs(int x, int fa) { /* 染色 */
    for (int i = h[x]; i != 0; i = e[i].nxt) {
        int o = e[i].i;
        if (o == fa)
            continue;
        if (w[o]) {
            if (w[o] == w[x])
                odd = true;
            A = x, B = o;
        }
        else {
            w[o] = -w[x];
            sum += w[o];
            dfs(o, x);
        }
    }
}
inline void Dfs(int x, int fa) { /* 求解 */
    for (int i = h[x]; i != 0; i = e[i].nxt) {
        int o = e[i].i;
        if (o == fa || (o == A && x == B) || (o == B && x == A))
            continue; /* 拆掉基环树成为树先做 */
        Dfs(o, x);
        w[x] += w[o];
        k[x] += k[o];
    }
}
signed main() {
    read(n), read(m);
    for (register int i = 0; i < m; ++i) {
        read(x), read(y);
        _add(x, y);
    }
    if (n % 2) {
        puts("-1");
        return 0;
    }
    w[1] = 1;
    sum = 1;
    dfs(1, 0);
    if (m != n) /* 树 */ {
        if (sum) {
            puts("-1");
            return 0;
        }
    } else {
        if (odd) /* 奇环 */ {
            if (sum & 1) {//奇环最后那条边可以将sum加减2，所以sum只要是偶数就可以满足
                puts("-1");
                return 0;
            }
            ans += abs(sum / 2);
            w[A] -= sum / 2, w[B] -= sum / 2;
            //这两行预处理奇环对sum的改变
        } else /* 偶环 */ {
            if (sum) {
                puts("-1");
                return 0;
            }
            k[A] = 1, k[B] = -1;//用于标记偶环树环上的点
        }
    }
    Dfs(1, 0);
    for (register int i = 1; i <= n; ++i) {
        if (k[i])
            s[++top] = k[i] * w[i];
        else
            ans = ans + abs(w[i]);
    }
    s[++top] = 0;
    sort(s + 1, s + top + 1);
    mid = s[(top + 1) / 2];
    for (register int i = 1; i <= top; ++i)
        ans += abs(s[i] - mid);
    printf("%lld\n", ans);
    return 0;
}

Compiler output:
a.cc: In function 'void read(long long int&)':
a.cc:8:6: error: 'chtholly2317' was not declared in this scope
    8 |      chtholly2317   if (c == '-')
      |      ^~~~~~~~~~~~
a.cc: In function 'int main()':
a.cc:73:23: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
   73 |     for (register int i = 0; i < m; ++i) {
      |                       ^
a.cc:107:23: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  107 |     for (register int i = 1; i <= n; ++i) {
      |                       ^
a.cc:116:23: warning: ISO C++17 does not allow 'register' storage class specifier [-Wregister]
  116 |     for (register int i = 1; i <= top; ++i)
      |                       ^