Submission #1295893

#TimeUsernameProblemLanguageResultExecution timeMemory
1295893kawhietConnecting Supertrees (IOI20_supertrees)C++20
100 / 100
135 ms26384 KiB
#include <bits/stdc++.h>
#include "supertrees.h"
using namespace std;

vector<int> cur;
map<int, int> m;

void dfs(int u, vector<vector<int>> &g, vector<bool> &vis) {
    cur.push_back(m[u]);
    vis[m[u]] = 1;
    for (auto v : g[m[u]]) {
        if (!vis[m[v]]) {
            dfs(m[v], g, vis);
        }
    }
}

int construct(vector<vector<int>> p) {
    int n = p.size();
    vector<vector<int>> twos(n), ones(n);
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < n; j++) {
            if (p[i][j] == 2) {
                twos[i].push_back(j);
            } else if (p[i][j] == 1) {
                ones[i].push_back(j);
            } else if (p[i][j] == 3) {
                return 0;
            }
        }
    }
    for (int i = 0; i < n; i++) {
        m[i] = i;
    }
    vector<bool> vis1(n), vis2(n);
    vector<vector<int>> a, b;
    for (int i = 0; i < n; i++) {
        if (!vis1[i]) {
            cur.clear();
            dfs(i, ones, vis1);
            a.push_back(cur);
        }
        if (!vis2[i]) {
            cur.clear();
            dfs(i, twos, vis2);
            b.push_back(cur);
        }
    }
    for (auto k : a) {
        for (auto x : k) {
            for (auto y : k) {
                if (p[x][y] == 0) {
                    return 0;
                }
            }
        }
    }
    for (auto k : b) {
        for (auto x : k) {
            for (auto y : k) {
                if (p[x][y] == 0) {
                    return 0;
                }
            }
        }
    }
    b.clear();
    vis2.assign(n, 0);
    vector<vector<int>> ans(n, vector<int>(n));
    for (auto k : a) {
        for (int i = 1; i < k.size(); i++) {
            m[k[i]] = k[0];
            ans[k[i]][k[i - 1]] = 1;
            ans[k[i - 1]][k[i]] = 1;
        }
    }
    for (int i = 0; i < n; i++) {
        if (!vis2[m[i]]) {
            cur.clear();
            dfs(m[i], twos, vis2);
            b.push_back(cur);
        }
    }
    for (auto k : b) {
        if (k.size() == 1) {
            continue;
        }
        if (k.size() == 2) {
            return 0;
        }
        for (int i = 1; i < k.size(); i++) {
            int u = m[k[i]], v = m[k[i - 1]];
            ans[u][v] = ans[v][u] = 1;
        }
        int u = m[k.back()], v = m[k[0]];
        ans[u][v] = ans[v][u] = 1;
    }
    build(ans);
    return 1;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...