제출 #1187214

#제출 시각아이디문제언어결과실행 시간메모리
1187214UnforgettableplNewspapers (CEOI21_newspapers)C++20
8 / 100
1 ms584 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long


int32_t main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    int n,M;
    cin >> n >> M;
    if(M!=n-1){
        cout << "NO\n";
        return 0;
    }
    vector<vector<int>> adj(n+1);
    for(int i=1;i<=M;i++){
        int u,v;cin>>u>>v;
        adj[u].emplace_back(v);
        adj[v].emplace_back(u);
    }
    pair<int,int> ans = {0,0};
    int p1 = 0;
    int p2 = 0;
    {
        vector<int> subsize(n+1);
        function<int(int,int)> subsizeDFS = [&](int x,int p){
            subsize[x]=1;
            for(int&i:adj[x])if(i!=p)subsize[x]+=subsizeDFS(i,x);
            return subsize[x];
        };
        function<void(int,int,int)> dfs = [&](int x,int p,int dist){
            if(ans.first<dist)ans={dist,x};
            sort(adj[x].rbegin(),adj[x].rend(),[&](const int &a,const int &b){return subsize[a]<subsize[b];});
            for(int&i:adj[x])if(i!=p)dfs(i,x,dist+1);
        };
        subsizeDFS(1,0);
        dfs(1,0,1);
        p1 = ans.second;
        ans = {0,0};
        subsize = vector<int>(n+1);
        subsizeDFS(p1,0);
        dfs(p1,0,1);
        p2 = ans.second;
        ans = {0,0};
        subsize = vector<int>(n+1);
        subsizeDFS(p2,0);
        dfs(p2,0,1);
        p1 = ans.second;
    }
    vector<bool> isOnDia(n+1);
    {
        function<bool(int,int)> dfs = [&](int x,int p){
            if(x==p2){isOnDia[x]=true;return true;}
                for(int&i:adj[x])if(i!=p)if(dfs(i,x)){isOnDia[x]=true;return true;}
            return false;
        };
        dfs(p1,0);
    }
    bool works = true;
    vector<int> walk;
    {
        function<void(int,int)> generateDFS = [&](int x,int p){
            if(!isOnDia[x]){
                if(!isOnDia[p]){
                    if(adj[x].size()>1)works=false;
                    return;
                }
                if(adj[x].size()==2){
                    walk.emplace_back(x);
                    walk.emplace_back(p);
                } else if(adj[x].size()>2)works=false;
                for(int&i:adj[x])if(i!=p)generateDFS(i,x);
                return;
            }
            if(x!=p1 and x!=p2)walk.emplace_back(x);
            for(int&i:adj[x])if(!isOnDia[i])generateDFS(i,x);
            for(int&i:adj[x])if(i!=p and isOnDia[i])generateDFS(i,x);
        };
        generateDFS(p1,0);
    }
    vector<int> revWalk = walk;
    reverse(revWalk.begin(),revWalk.end());
    for(int&i:revWalk)walk.emplace_back(i);
    if(n<=2)walk.emplace_back(1);
    if(n==2)walk.emplace_back(1);
    if(works){
        cout << "YES\n";
        cout << walk.size() << '\n';
        for(int&i:walk)cout<<i<<' ';
        cout << '\n';
    } else cout << "NO\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...