Submission #473962

#TimeUsernameProblemLanguageResultExecution timeMemory
473962model_codeNewspapers (CEOI21_newspapers)C++17
100 / 100
254 ms8228 KiB
#include <bits/stdc++.h>

#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define REP(i, n) FOR(i, 0, n)
#define ll long long

using namespace std;

const int MAXN = 1010;

vector <int> ve[MAXN];
int bio[MAXN];

void impossible() {
    cout << "NO\n";
    exit(0);
}

void dfs(int x, int par) {
    bio[x] = bio[par] + 1;

    for (int y : ve[x]) {
        if (y == par) continue;
        if (bio[y]) impossible();
        dfs(y, x);
    }

    return;
}

int main_path[MAXN];
vector <int> path;
int twig[MAXN];

int rek(int x, int par) {
    int ma = 0;
    for (int y : ve[x]) {
        if (y == par) continue;
        if (main_path[y]) continue;
        ma = max(ma, rek(y, x));
    }
    if (ma == 3) impossible();
    twig[x] = ma;
    return ma + 1;
}

vector <int> out;

void print() {
    cout << "YES\n";
    cout << out.size() << "\n";
    for (int x : out) cout << x + 1 << " ";
    cout << "\n";

    return;
}

int main() {
    int n, m;
    cin >> n >> m;

    if (n == 1) {
        out.push_back(0);
        print();
        return 0;
    }

    if (n == 2) {
        out.push_back(0);
        out.push_back(0);
        print();
        return 0;
    }

    REP(i, m) {
        int a, b;
        cin >> a >> b;
        a--, b--;
        ve[a].push_back(b);
        ve[b].push_back(a);
    }

    dfs(0, 0);
    int A = -1, dist = -1;
    REP(i, n) {
        if (bio[i] > dist) {
            dist = bio[i];
            A = i;
        }
    }

    memset(bio, 0, sizeof bio);
    dfs(A, A);
    int B = -1;
    dist = -1;
    REP(i, n) {
        if (bio[i] > dist) {
            dist = bio[i];
            B = i;
        }
    }

    int x = B;
    while (x != A) {
        main_path[x] = 1;
        path.push_back(x);
        for (int y : ve[x]) {
            if (bio[y] == bio[x] - 1) {
                x = y;
                break;
            }
        }
    }
    path.push_back(A);
    main_path[A] = 1;

    memset(twig, 0, sizeof twig);
    REP(i, n) {
        if (main_path[i]) twig[i] = rek(i, i) - 1;
    }

    // remove first and last node of path to optimise
    if (path.size() > 1) {
        main_path[path[0]] = 0;
        path.erase(path.begin());

        twig[path[0]] = max(twig[path[0]], 1);
    }
    reverse(path.begin(), path.end());
    if (path.size() > 1) {
        main_path[path[0]] = 0;
        path.erase(path.begin());

        twig[path[0]] = max(twig[path[0]], 1);
    }

    for (int x : path) {
        out.push_back(x);
        if (twig[x] == 2) {
            for (int y : ve[x]) {
                if (main_path[y] || twig[y] == 0) continue;
                out.push_back(y);
                out.push_back(x);
            }
        }
    }

    reverse(path.begin(), path.end());

    for (int x : path) {
        out.push_back(x);
        if (twig[x] == 2) {
            for (int y : ve[x]) {
                if (main_path[y] || twig[y] == 0) continue;
                out.push_back(y);
                out.push_back(x);
            }
        }
    }

    print();

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