답안 #301421

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
301421 2020-09-17T23:15:43 Z cuom1999 슈퍼트리 잇기 (IOI20_supertrees) C++14
0 / 100
1 ms 256 KB
#include <bits/stdc++.h>
#include "supertrees.h"
using namespace std;
 
struct Solver {
    int n;
    vector<bool> vs;
    vector<int> lineIndex, cycleIndex;
    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);
        cycleIndex.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);
        cycleIndex[a] = c;
        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() > 1) 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;
            }
        }
 
        // check satisfaction
        // p[i][j] = 0, p[j][k] = 0, p[i][k] > 0
        // p[i][j] = 1 iff lineIndex[i] = lineIndex[j]
        for (int i = 0; i < n; i++) {
            if (cycle[i].size() <= 2) return 0;
            for (int j = 0; j < n; j++) {
                int a = cycleIndex[lineIndex[i]];
                int b = cycleIndex[lineIndex[j]];
                if (p[i][j] == 0 && a == b) {
                    return 0;
                }
                if (p[i][j] && a != b) {
                    return 0;
                }
                if (p[i][j] == 1 && lineIndex[i] != lineIndex[j]) {
                    return 0;
                }
                if (p[i][j] == 2 && lineIndex[i] == lineIndex[j]) {
                    return 0;
                } 
            }
        }
 
 
        build(res);
    
        return 1;
    }
};
 
 
int construct(vector<vector<int>> p) {
    return Solver(p).solve();
}

Compilation message

supertrees.cpp: In constructor 'Solver::Solver(std::vector<std::vector<int> >)':
supertrees.cpp:9:25: warning: 'Solver::p' will be initialized after [-Wreorder]
    9 |     vector<vector<int>> p, line, cycle;
      |                         ^
supertrees.cpp:6:9: warning:   'int Solver::n' [-Wreorder]
    6 |     int n;
      |         ^
supertrees.cpp:11:5: warning:   when initialized here [-Wreorder]
   11 |     Solver(vector<vector<int>> p): p(p), n(p.size()) {
      |     ^~~~~~
supertrees.cpp: In member function 'int Solver::solve()':
supertrees.cpp:63:35: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   63 |             for (int j = 0; j + 1 < line[i].size(); j++) {
      |                             ~~~~~~^~~~~~~~~~~~~~~~
supertrees.cpp:69:35: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   69 |             for (int j = 0; j + 1 < cycle[i].size(); j++) {
      |                             ~~~~~~^~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 256 KB Answer gives possible 0 while actual possible 1
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 256 KB Answer gives possible 0 while actual possible 1
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 256 KB Answer gives possible 0 while actual possible 1
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 0 ms 256 KB Answer gives possible 0 while actual possible 1
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 256 KB Answer gives possible 0 while actual possible 1
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 256 KB Answer gives possible 0 while actual possible 1
2 Halted 0 ms 0 KB -