Submission #1301143

#TimeUsernameProblemLanguageResultExecution timeMemory
1301143sanoConnecting Supertrees (IOI20_supertrees)C++20
0 / 100
1 ms348 KiB
// Source: https://usaco.guide/general/io
#include <iostream>  // cin, cout, cerr
#include <vector>    // vector
#include <string>    // string
#include <set>
#include "supertrees.h"

#define vec vector
#define mod 1000000007
#define For(i,n) for(int i = 0; i < n; i++)
using namespace std;

int komponenty(vec<vec<int>>& p, vec<vec<int>>& comp, vec<int>& t) {
    int n = p.size();
    vec<int> kde(n, -1);
    for (auto i : t) {
        int zakl = 0;
        if (kde[i] == -1) {
            vec<int> s;
            s.push_back(i);
            comp.push_back(s);
            kde[i] = comp.size() - 1;
            zakl = 1;
        }
        int poc = 0;
        For(j, n) {
            if (p[i][j] == 0) continue;
            poc++;
            if (kde[j] == -1) {
                if (zakl) {
                    kde[j] = kde[i];
                    comp[kde[i]].push_back(j);
                } else {
                    return 0;
                }
            }
            if (kde[j] != kde[i]) {
                return 0;
            }
        }
        if (poc != comp[kde[i]].size()) return 0;
    }
    return 1;
}

int construct(vec<vec<int>> p) {
    int n = p.size();
    vec<vec<int>> odp(n, vec<int>(n));
    vec<vec<int>> comp;
    vec<int> t;
    For(i, n) {
        t.push_back(i);
    }
    cerr << "trolko" << endl;
    int da_sa = komponenty(p, comp, t);

    For(i, n) {
        For(j, n) {
            if (p[i][j] == 2) p[i][j] = 0;
        }
    }


    For(i, comp.size()) {
        if (comp[i].size() == 1) continue;
        vec<vec<int>> comp2;
        da_sa = komponenty(p, comp2, comp[i]);
        cerr << "comp[" << i << "] ";
        for (auto x : comp[i]) cerr << x << ' ';
        cerr << endl;


        For(j, comp2.size()) {
            For(k, comp2[j].size() - 1) {
                odp[comp2[j][k]][comp2[j][k+1]] = 1;
                odp[comp2[j][k+1]][comp2[j][k]] = 1;
            }
            int p1 = comp2[j][0];
            int p2 = comp2[(j+1) % (comp2.size())][0];
            odp[p1][p2] = 1;
            odp[p2][p1] = 1;
        }
    }

    build(odp);
    return 1;
}

/*
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    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...
#Verdict Execution timeMemoryGrader output
Fetching results...