제출 #706400

#제출 시각아이디문제언어결과실행 시간메모리
706400danikoynov수천개의 섬 (IOI22_islands)C++17
55 / 100
38 ms6156 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);
        reverse(cycle.begin(), cycle.end());
        int cycle_ver = cycle.back();
        vector < int > bef;
        int i;
        for (i = 0; i < cycle.size(); i ++)
        {
            if (cycle[i] == cycle_ver)
                break;
            int pt = 0;
            while(graph[cycle[i]][pt].first != cycle[i + 1])
                pt ++;
            bef.push_back(graph[cycle[i]][pt].second);
        }
        vector < int > cycle_path[2];

        for (i; i < cycle.size() - 1; i ++)
        {
                        int pt = 0;
            while(graph[cycle[i]][pt].first != cycle[i + 1])
                pt ++;

            cycle_path[0].push_back(graph[cycle[i]][pt].second);
            cycle_path[1].push_back((graph[cycle[i]][pt].second ^ 1));
        }

        vector < int > fin;
        for (int v : bef)
            fin.push_back(v);
        for (int v : cycle_path[0])
            fin.push_back(v);
        for (int v : cycle_path[1])
            fin.push_back(v);
        reverse(cycle_path[0].begin(), cycle_path[0].end());
        reverse(cycle_path[1].begin(), cycle_path[1].end());
        reverse(bef.begin(), bef.end());
        for (int v : cycle_path[0])
            fin.push_back(v);
        for (int v : cycle_path[1])
            fin.push_back(v);
        for (int v : bef)
            fin.push_back(v);
        return fin;
    }
    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;
    }
}

컴파일 시 표준 에러 (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;
      |                      ^~~~
islands.cpp:139:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  139 |         for (i = 0; i < cycle.size(); i ++)
      |                     ~~^~~~~~~~~~~~~~
islands.cpp:150:14: warning: statement has no effect [-Wunused-value]
  150 |         for (i; i < cycle.size() - 1; i ++)
      |              ^
islands.cpp:150:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  150 |         for (i; i < cycle.size() - 1; i ++)
      |                 ~~^~~~~~~~~~~~~~~~~~
#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...