Submission #706395

#TimeUsernameProblemLanguageResultExecution timeMemory
706395danikoynovThousands Islands (IOI22_islands)C++17
39.40 / 100
40 ms6160 KiB
#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];
vector < pair < int, int > > graph[maxn];

int used[maxn];
vector < int > cycle;
bool dfs(int v)
{
    used[v] = 1;
    for (pair < int, int > nb : graph[v])
    {
        int u = nb.first;
        if (used[u] == 1)
        {
            cycle.push_back(u);
            return true;
        }
        if (!used[u])
        {
            if (dfs(u) == true)
            {
                cycle.push_back(u);
                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 ++)
        {
            graph[U[i]].push_back({V[i], i});
        }

        bool tf = dfs(0);
        if (!tf)
            return false;
        cycle.push_back(0);
        return true;
    }
    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)

islands.cpp: In function 'std::variant<bool, std::vector<int, std::allocator<int> > > find_journey(int, int, std::vector<int>, std::vector<int>)':
islands.cpp:86:22: warning: unused variable 'last' [-Wunused-variable]
   86 |         int ver = 0, last = -1;
      |                      ^~~~
#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...