제출 #1370168

#제출 시각아이디문제언어결과실행 시간메모리
1370168leolin0214수천개의 섬 (IOI22_islands)C++20
27.75 / 100
14 ms5148 KiB
#include "islands.h"

#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
#include <variant>

using namespace std;

struct Graph {
    int n;
    vector<vector<pair<int, int>>> adj;
    Graph(int _n) : n(_n), adj(n) {}
    void add_edge(int u, int v, int id) {
        adj[u].push_back({v, id});
    }
    vector<int> solve() {
        vector<bool> vis(n);
        vector<int> stk, ans;
        auto dfs = [&] (auto dfs, int u, int frm) -> bool {
            vis[u] = true;
            vector<int> ls;
            for (auto [v, id]: adj[u]) {
                if (id != (frm ^ 1)) ls.push_back(id);
            }
            
            if (ls.size() >= 2) {
                int x = ls[0], y = ls[1];
                ans.clear();
                ans.insert(ans.end(), stk.begin(), stk.end());
                ans.push_back(x);
                ans.push_back(x^1);
                ans.push_back(y);
                ans.push_back(y^1);
                ans.push_back(x^1);
                ans.push_back(x);
                ans.push_back(y^1);
                ans.push_back(y);
                ans.insert(ans.end(), stk.rbegin(), stk.rend());
                return true;
            }            
            for (auto [v, id]: adj[u]) {
                if (vis[v]) continue;
                stk.push_back(id);
                if (dfs(dfs, v, id)) return true;
                stk.pop_back();
            }
            return false;
        };
        dfs(dfs, 0, -1);
        return ans;
    }
};

std::variant<bool, std::vector<int>> find_journey(int N, int M, std::vector<int> U, std::vector<int> V) 
{  
    int n = N, m = M;
    if (n == 2) {
        vector<int> c[2];
        for (int i=0; i<M; i++) c[U[i]].push_back(i);

        if (c[0].size() < 2 || c[1].size() < 1) return false;
        
        int x = c[0][0], y = c[0][1];
        int z = c[1][0];

        vector<int> ans = {x, z, y, x, z, y};
        return true, ans;
    }

    Graph g(n);
    for (int i=0; i<m; i++) g.add_edge(U[i], V[i], i);

    auto ans = g.solve();
    if (ans.size()) return true, ans;
    return false;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…