#include <bits/stdc++.h>
#define int long long
#define MAX 300000
using namespace std;
typedef array<int, 2> pr;
vector<pr> adj[MAX];
int depth[MAX], val[MAX][2], cycle = 0;
void dfs(int node, int par) {
    for (pr i : adj[node]) {
        if (i[1] == par)
            continue;
        if (!depth[i[0]]) {
            depth[i[0]] = depth[node] + 1, dfs(i[0], i[1]);
            val[node][0] += val[i[0]][0], val[node][1] += val[i[0]][1];
        } else {
            if (depth[i[0]] > depth[node])
                continue;
            if ((depth[i[0]] - depth[node]) & 1)
                val[node][0]++, val[i[0]][0]--;
            else
                cycle++, val[node][1]++, val[i[0]][1]--;
        }
    }
}
signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);
    int N, M, X, Y, ans = 0;
    cin >> N >> M;
    for (int i = 1; i <= M; i++) {
        cin >> X >> Y;
        adj[X].push_back({Y, i}), adj[Y].push_back({X, i});
    }
    for (int i = 1; i <= N; i++) {
        if (depth[i])
            continue;
        depth[i] = 1, dfs(i, 0);
    }
    for (int i = 1; i <= N; i++) {
        if (depth[i] == 1)
            continue;
        if (!val[i][0] && val[i][1] == cycle)
            ans++;
    }
    if (cycle == 1)
        ans++;
    cout << ans << '\n';
    return 0;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |