# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
642938 | _petar_b | Connecting Supertrees (IOI20_supertrees) | C++14 | 1179 ms | 2033428 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 (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 && graph[i] == graph[j])
{
if (p[i][j] == 2) all0 = false;
if (p[i][j] == 1)
{
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)
{
kraci.push_back(empt);
kraci[kraci.size()-1].push_back(i);
krak[i] = kraci.size() - 1;
ciklusi[graph[i]].push_back(i);
}
else
kraci[krak[i]].push_back(i);
}
}
//povezivanje ciklusa
for (int i = 1; i < graph_count; i++) if (!ciklusi[i].empty())
{
if (ciklusi[i].size() == 1)
;
else if (ciklusi[i].size() == 2)
return 0;
else
{
int last = ciklusi[i][0];
for (int j = 1; j < ciklusi[i].size(); j++)
{
answer[last][ciklusi[i][j]] = 1;
answer[ciklusi[i][j]][last] = 1;
last = ciklusi[i][j];
}
answer[ciklusi[i][0]][last] = 1;
answer[last][ciklusi[i][0]] = 1;
}
}
//povezivanje krakova
for (int i = 1; i < kraci.size(); i++)
{
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;
}
}
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... |