# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
706394 | danikoynov | Thousands Islands (IOI22_islands) | C++17 | 34 ms | 4856 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 "islands.h"
#include <variant>
#include <vector>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn = 1010;
int edge_index[maxn][maxn], deg[maxn];
vector < int > g[maxn];
int used[maxn];
vector < int > cycle;
bool dfs(int v)
{
used[v] = 1;
for (int u : g[v])
{
if (used[u] == 1)
{
cycle.push_back(u);
return true;
}
if (!used[u])
{
if (dfs(u) == true)
return true;
}
}
used[v] = 2;
return false;
}
std::variant<bool, std::vector<int>> find_journey(
int N, int M, std::vector<int> U, std::vector<int> V)
{
bool spec = true, double_spec = true;;
for (int i = 0; i < M; i += 2)
{
if (V[i] != U[i + 1] || U[i] != V[i + 1])
spec = false;
if (V[i] != V[i + 1] || U[i] != U[i + 1])
double_spec = false;
}
if (N == 2)
{
int cnt0 = 0, cnt1 = 0;
vector < int > idx0, idx1;
for (int i = 0; i < M; i ++)
{
if (U[i] == 0)
cnt0 ++, idx0.push_back(i);
else
cnt1 ++, idx1.push_back(i);
}
if (cnt0 >= 2 && cnt1 >= 1)
{
vector < int > path;
path.push_back(idx0[0]);
path.push_back(idx1[0]);
path.push_back(idx0[1]);
path.push_back(idx0[0]);
path.push_back(idx1[0]);
path.push_back(idx0[1]);
return path;
}
return false;
}
else if (spec)
{
for (int i = 0; i < M; i ++)
{
deg[U[i]] ++;
g[U[i]].push_back(i);
}
vector < int > bef, path;
int ver = 0, last = -1;
while(true)
{
if (deg[ver] == 0)
return false;
if (deg[ver] == 1)
{
bef.push_back(g[ver][0]);
int new_ver = V[g[ver][0]];
int pt = 0;
while(V[g[new_ver][pt]] != ver)
pt ++;
///cout << "here " << ver << " " << new_ver << " " << V[g[new_ver][pt]] << endl;
g[new_ver].erase(g[new_ver].begin() + pt);
deg[new_ver] --;
ver = new_ver;
continue;
}
path.push_back(g[ver][0]);
path.push_back((g[ver][0] ^ 1));
path.push_back((g[ver][1]));
path.push_back((g[ver][1] ^ 1));
path.push_back((g[ver][0] ^ 1));
path.push_back(g[ver][0]);
path.push_back((g[ver][1] ^ 1));
path.push_back((g[ver][1]));
break;
}
vector < int > fin = bef;
for (int v : path)
fin.push_back(v);
reverse(bef.begin(), bef.end());
for (int v : bef)
fin.push_back(v);
return fin;
}
if (double_spec)
{
for (int i = 0; i < M; i ++)
{
g[U[i]].push_back(V[i]);
}
return dfs(0);
}
else
{
for (int i = 0; i < M; i ++)
edge_index[U[i]][V[i]] = i;
vector < int > path;
path.push_back(edge_index[0][1]);
path.push_back(edge_index[1][0]);
path.push_back(edge_index[0][2]);
path.push_back(edge_index[2][0]);
path.push_back(edge_index[1][0]);
path.push_back(edge_index[0][1]);
path.push_back(edge_index[2][0]);
path.push_back(edge_index[0][2]);
return path;
}
}
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... |