| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 | 
|---|---|---|---|---|---|---|---|
| 301414 | cuom1999 | 슈퍼트리 잇기 (IOI20_supertrees) | C++14 | 0 ms | 256 KiB | 
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
#include "supertrees.h"
using namespace std;
struct Solver {
    int n;
    vector<bool> vs;
    vector<int> lineIndex;
    vector<vector<int>> p, line, cycle;
    Solver(vector<vector<int>> p): p(p), n(p.size()) {
        vs.resize(n);
        lineIndex.resize(n);
        line.resize(n);
        cycle.resize(n);
    }
    void dfs1(int a, int c) {
        if (vs[a]) return;
        vs[a] = 1;
        lineIndex[a] = c;
        line[c].push_back(a);
        for (int i = 0; i < n; i++) {
            if (p[a][i] == 1) dfs1(i, c);
        }
    }
    void dfs2(int a, int c) {
        if (vs[a]) return;
        vs[a] = 1;
        cycle[c].push_back(a);
        for (int i = 0; i < n; i++) {
            if (p[a][i] == 2) dfs2(i, c);
        }
    }
    int solve() {
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                if (p[i][j] == 3) return 0;
            }
        }
        for (int i = 0; i < n; i++) {
            if (!vs[i]) dfs1(i, i);
        }
        for (int i = 0; i < n; i++) {
            if (lineIndex[i] == i) vs[i] = 0;
        }
        for (int i = 0; i < n; i++) {
            if (!vs[i]) dfs2(i, i);
        }
        // construct res
        vector<vector<int>> res(n, vector<int>(n));
        for (int i = 0; i < n; i++) {
            for (int j = 0; j + 1 < line[i].size(); j++) {
                int x = line[i][j], y = line[i][j + 1];
                res[x][y] = res[y][x] = 1;
            }
            if (cycle[i].size()) cycle[i].push_back(cycle[i][0]);
            for (int j = 0; j + 1 < cycle[i].size(); j++) {
                int x = cycle[i][j], y = cycle[i][j + 1];
                res[x][y] = res[y][x] = 1;
            }
        }
        build(res);
        // for (int i = 0; i < n; i++) {
        //     cout << lineIndex[i] << " ";
        // }
        // cout << endl;
        // for (int i = 0; i < n; i++) {
        //     if (cycle[i].size()) {
        //         for (auto j: cycle[i]) cout << j << " ";
        //         cout << endl;
        //     }
        // }
        return 1;
    }
};
int construct(vector<vector<int>> p) {
    return Solver(p).solve();
}
컴파일 시 표준 에러 (stderr) 메시지
| # | Verdict | Execution time | Memory | Grader output | 
|---|---|---|---|---|
| Fetching results... | ||||
| # | Verdict | Execution time | Memory | Grader output | 
|---|---|---|---|---|
| Fetching results... | ||||
| # | Verdict | Execution time | Memory | Grader output | 
|---|---|---|---|---|
| Fetching results... | ||||
| # | Verdict | Execution time | Memory | Grader output | 
|---|---|---|---|---|
| Fetching results... | ||||
| # | Verdict | Execution time | Memory | Grader output | 
|---|---|---|---|---|
| Fetching results... | ||||
| # | Verdict | Execution time | Memory | Grader output | 
|---|---|---|---|---|
| Fetching results... | ||||
