# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
642929 | _petar_b | Connecting Supertrees (IOI20_supertrees) | C++14 | 1118 ms | 1722620 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "supertrees.h"
#include <bits/stdc++.h>
#define MAXN 1010
using namespace std;
int graph[MAXN], graph_count = 1, krak[MAXN];
int dfs(int node, vector<vector<int>> p)
{
graph[node] = graph_count;
int r = 0;
for (int i = 0; i < p.size(); i++)
{
if (p[node][i])
{
if ((graph[i] != 0 && graph[i] != graph[node]) || (p[node][i] == 3))
return 1;
if (graph[i] == 0)
r = dfs(i, p);
if (r == 1)
return 1;
}
else if (p[node][i] == 0 && graph[i] == graph[node])
return 1;
}
return r;
}
int construct(std::vector<std::vector<int>> p) {
int n = p.size();
std::vector<std::vector<int>> answer;
for (int i = 0; i < n; i++) {
std::vector<int> row;
row.resize(n, 0);
answer.push_back(row);
}
//
for (int i = 0; i < n; i++) if (graph[i] == 0)
{
int r = dfs(i, p);
if (r) return 0;
graph_count++;
}
//
vector<vector<int>> kraci;
vector<int> empt; kraci.push_back(empt);
vector<vector<int>> ciklusi;
ciklusi.resize(graph_count);
for (int i = 0 ; i < n; i++)
{
bool all2 = true, all0 = true;
for (int j = 0; j < n; j++) if (j != i)
{
if (p[i][j] == 2) all0 = false;
if (p[i][j] == 1 && graph[i] == graph[j])
{
all2 = false;
all0 = false;
if (krak[i] == 0)
{
krak[i] = krak[j];
}
else if (krak[j] != 0 && krak[i] != krak[j])
return 0;
}
}
if (all0)
;
else if (all2)
{
ciklusi[graph[i]].push_back(i);
}
else
{
if (krak[i] == 0)
{
empt.push_back(i);
kraci.push_back(empt);
krak[i] = kraci.size() - 1;
empt.clear();
}
else
kraci[krak[i]].push_back(i);
}
}
vector<int> first;
first.resize(graph_count, -1);
vector<int> last;
last.resize(graph_count, -1);
for (int i = 1; i < graph_count; i++) if (!ciklusi[i].empty())
{
first[i] = ciklusi[i][0];
last[i] = ciklusi[i][0];
for (int j = 1; j < ciklusi[i].size(); j++)
{
answer[last[i]][ciklusi[i][j]] = 1;
answer[ciklusi[i][j]][last[i]] = 1;
last[i] = ciklusi[i][j];
}
}
for (int i = 1; i < kraci.size(); i++)
{
int elm = kraci[i][0];
if (first[graph[elm]] == -1)
{
first[graph[elm]] = elm;
last[graph[elm]] = elm;
}
else
{
answer[last[graph[elm]]][elm] = 1;
answer[elm][last[graph[elm]]] = 1;
last[graph[elm]] = elm;
}
for (int j = 1; j < kraci[i].size(); j++)
{
answer[kraci[i][j-1]][kraci[i][j]] = 1;
answer[kraci[i][j]][kraci[i][j-1]] = 1;
}
}
for (int i = 1; i < graph_count; i++)
if (first[i] != last[i])
{
answer[first[i]][last[i]] = 1;
answer[last[i]][first[i]] = 1;
}
build(answer);
return 1;
}
Compilation message (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... |