제출 #1339717

#제출 시각아이디문제언어결과실행 시간메모리
1339717omsincoconut슈퍼트리 잇기 (IOI20_supertrees)C++17
46 / 100
124 ms22280 KiB
#include "supertrees.h"
#include <bits/stdc++.h>

using namespace std;

int construct(vector<vector<int>> p) {
	int n = p.size();
	vector<vector<int>> answer(n, vector<int>(n, 0));

    for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) if (p[i][j] == 3) return 0;

    auto bfs = [&](int allow) {
        vector<int> in_comp(n, -1);
        vector<vector<int>> comps;

        int cur_comp = 0;
        for (int i = 0; i < n; i++) {
            if (in_comp[i] != -1) continue;

            vector<int> comp_element;
            queue<int> bfs;
            bfs.push(i);
            while (!bfs.empty()) {
                int u = bfs.front();
                bfs.pop();
                if (in_comp[u] != -1) continue;
                in_comp[u] = cur_comp;
                comp_element.push_back(u);

                for (int j = 0; j < n; j++) {
                    if ((allow>>p[i][j])&1) bfs.push(j);
                }
            }

            comps.push_back(comp_element);
            cur_comp++;
        }

        return make_pair(in_comp, comps);
    };

    auto [chain_id, chains] = bfs(2);
    auto [cycle_id, cycles] = bfs(4);

    for (vector<int> chain : chains) {
        for (int i = 0; i < (int)chain.size()-1; i++) {
            answer[chain[i]][chain[i+1]] = answer[chain[i+1]][chain[i]] = 1;
            for (int j = 0; j < (int)chain.size(); j++) {
                if (p[chain[i]][chain[j]] != 1) return 0;
            }
        }
    }

    for (vector<int> cycle : cycles) {
        vector<int> subchains;
        for (int i : cycle) subchains.push_back(chain_id[i]);
        sort(subchains.begin(), subchains.end());
        subchains.resize(unique(subchains.begin(), subchains.end()) - subchains.begin());
        if (subchains.size() == 1) continue;
        if (subchains.size() == 2) return 0;

        for (int i = 0; i < (int)subchains.size(); i++) {
            int cur = subchains[i], nxt = subchains[(i+1)%subchains.size()];
            answer[chains[cur][0]][chains[nxt][0]] = answer[chains[nxt][0]][chains[cur][0]] = 1;
        }
    }

    build(answer);
    return 1;
}

/*
4
1 1 2 2
1 1 2 2
2 2 1 2
2 2 2 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...