제출 #1328787

#제출 시각아이디문제언어결과실행 시간메모리
1328787model_codeDomjenak (COCI25_domjenak)C++20
110 / 110
621 ms81460 KiB
#include<bits/stdc++.h>

using namespace std;

const int MAXN = 5e5 + 5;

int n, m;
int dp[2 * MAXN];
int nxt[2 * MAXN];
int deg[2 * MAXN];
int side[2 * MAXN];
int match[2 * MAXN];
vector<int> adj[2 * MAXN];

void dfs(int u, int flag) {
    if(side[u] != -1) return;
    side[u] = flag;
    for(int v : adj[u]) dfs(v, !flag);
}

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

    cin >> n >> m;
    for(int i = 0, u, v;i < m;i++) {
        cin >> u >> v;
        u--, v--;
        deg[u]++, deg[v]++;
        adj[u].push_back(v);
        adj[v].push_back(u);
    }

    memset(side, -1, sizeof side);
    for(int i = 0;i < 2 * n;i++) 
        if(side[i] == -1) dfs(i, 0);
    
    queue<int> q;
    for(int i = 0;i < 2 * n;i++)
        if(!side[i] && deg[i] == 1) q.push(i);
    
    memset(nxt, -1, sizeof match);
    memset(match, -1, sizeof match);
    int ans = -1, s = -1;
    while(q.size()) {
        int u = q.front();
        q.pop();
        for(int v : adj[u])
            if(match[v] == -1)
                match[v] = u, match[u] = v;
        
        for(int v : adj[match[u]]) {
            if(match[v] == -1) {
                if(dp[v] < dp[u] + 1)
                    dp[v] = dp[u] + 1, nxt[v] = u;
                deg[v]--;
                if(deg[v] == 1) q.push(v);
            }
        }

        if(dp[u] > ans) ans = dp[u], s = u;
    }

    cout << 2 * (ans + 1) << "\n";
    while(true) {
        cout << match[s] + 1 << " " << s + 1;
        s = nxt[s];
        if(s == -1) break;
        else cout << " ";
    }
    cout << "\n";
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...