제출 #697563

#제출 시각아이디문제언어결과실행 시간메모리
697563piOOENewspapers (CEOI21_newspapers)C++17
4 / 100
306 ms524288 KiB
#include <bits/stdc++.h>

using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, m;
    cin >> n >> m;

    vector<vector<int>> adj(n);

    vector<int> fa(n);
    iota(fa.begin(), fa.end(), 0);

    auto leader = [&](int x) {
        while (x != fa[x]) x = fa[x] = fa[fa[x]];
        return x;
    };

    auto unite = [&](int x, int y) -> bool {
        x = leader(x), y = leader(y);
        return (x != y) && (fa[y] = x, true);
    };

    bool yay = true;

    for (int i = 0; i < m; ++i) {
        int x, y;
        cin >> x >> y;
        x -= 1, y -= 1;

        adj[x].push_back(y);
        adj[y].push_back(x);

        yay &= unite(x, y);
    }

    vector<int> down(n), up(n), parent(n, -1);

    auto dfs = [&](auto self, int v) -> void {
        for (int to : adj[v]) {
            if (to != parent[v]) {
                parent[to] = v;
                self(self, to);
                down[v] = max(down[v], down[to] + 1);
            }
        }
    };

    dfs(dfs, 0);

    auto gfs = [&](auto self, int v) -> void {
        vector<int> nxt(adj[v]);
        auto it = find(nxt.begin(), nxt.end(), parent[v]);

        if (it != nxt.end()) {
            nxt.erase(it);
        }

        int s = size(nxt);

        vector<int> pref(s + 1), suf(s + 1);

        for (int i = 0; i < s; ++i) {
            int to = nxt[i];
            pref[i + 1] = max(pref[i], down[to]);
        }

        for (int i = s - 1; i >= 0; --i) {
            int to = nxt[i];
            suf[i] = max(suf[i + 1], down[to]);

            up[to] = max(pref[i], suf[i + 1]);

            self(self, to);
        }
    };

    gfs(gfs, 0);

    for (int i = 0; i < n && yay; ++i) {
        int cnt = up[i] > 1;

        for (int to : adj[i]) {
            if (to != parent[i]) {
                cnt += down[to] > 1;
            }
        }

        yay &= cnt <= 2;
    }

    if (yay) {
        cout << "YES\n";

        cout << "1\n1\n";
    } else {
        cout << "NO\n";
    }

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...