Submission #1327251

#TimeUsernameProblemLanguageResultExecution timeMemory
1327251shirokuma5Newspapers (CEOI21_newspapers)C++20
75 / 100
145 ms4644 KiB
#include<bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (int)(n); i++)
#define rep1(i, n) for (int i = 1; i <= (int)(n); i++)
using namespace std;

void print(const vector<int> &a) {
    int n = a.size();
    cout << n << endl;
    rep(i, n) {
        cout << a[i];
        if (i == n - 1) cout << endl;
        else cout << " ";
    }
}

vector<vector<int>> G;

int main() {
    int n, m; cin >> n >> m;
    G.resize(n + 1);
    rep(i, m) {
        int u, v; cin >> u >> v;
        G[u].push_back(v); G[v].push_back(u);
    }

    if (m > n - 1) {
        cout << "NO" << endl; return 0;
    }

    rep1(i, n) {
        int cnt = 0;
        for (int nex : G[i]) {
            for (int chi : G[nex]) if (chi != i) {
                if (G[chi].size() > 1) {
                    cnt++; break;
                }
            }
        }
        if (cnt >= 3) {
            cout << "NO" << endl; return 0;
        }
    }

    cout << "YES" << endl;
    vector<int> res;

    int u = 1, v = 1;
    vector<int> d1(n + 1, -1), du(n + 1, -1);
    queue<int> todo;
    d1[1] = 0; todo.push(1);
    while (!todo.empty()) {
        int now = todo.front(); todo.pop(); u = now;
        for (int nex : G[now]) {
            if (d1[nex] == -1) {
                d1[nex] = d1[now] + 1; todo.push(nex);
            }
        }
    }
    du[u] = 0; todo.push(u);
    while (!todo.empty()) {
        int now = todo.front(); todo.pop(); v = now;
        for (int nex : G[now]) {
            if (du[nex] == -1) {
                du[nex] = du[now] + 1; todo.push(nex);
            }
        }
    }

    //cerr << u << " " << v << endl;
    int pre = -1, cur = v;
    while (1) {
        res.push_back(cur); if (cur == u) break;
        for (int nex : G[cur]) {
            if (nex == pre) continue;
            if (du[nex] > du[cur] && G[nex].size() > 1) {
                res.push_back(nex); res.push_back(cur);
            }
        }
        for (int nex : G[cur]) if (du[nex] == du[cur] - 1) {
            pre = cur; cur = nex; break;
        }
    }
    if (res.size() % 2 == 0) {
        pre = v; cur = G[v][0];
    }
    else {
        pre = -1, cur = v;
    }
    while (1) {
        res.push_back(cur); if (cur == u) break;
        for (int nex : G[cur]) {
            if (nex == pre) continue;
            if (du[nex] > du[cur] && G[nex].size() > 0) {
                res.push_back(nex); res.push_back(cur);
            }
        }
        for (int nex : G[cur]) if (du[nex] == du[cur] - 1) {
            pre = cur; cur = nex; break;
        }
    }

    print(res);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...