제출 #1074566

#제출 시각아이디문제언어결과실행 시간메모리
1074566Zicrus수천개의 섬 (IOI22_islands)C++17
8.40 / 100
38 ms10440 KiB
#include <bits/stdc++.h>
#include "islands.h"
using namespace std;
    
typedef long long ll;
    
int n, m;
vector<vector<pair<int, int>>> adj, revAdj; // edgeId, node
vector<bool> vst, edgeUsed;
stack<int> stk;
vector<int> lnk, sz, acc;
vector<int> numPaths;
    
void dfs1(int cur) {
    vst[cur] = true;
    for (auto &e : adj[cur]) {
        if (vst[e.second]) continue;
        dfs1(e.second);
    }
    stk.push(cur);
}
    
int dfs2(int cur, int rep) {
    vst[cur] = true;
    lnk[cur] = rep;
    sz[rep]++;
    int last = cur;
    for (auto &e : revAdj[cur]) {
        if (vst[e.second]) continue;
        edgeUsed[e.first] = true;
        last = dfs2(e.second, rep);
    }
    if (cur == rep && cur != last) {
        for (auto &e : adj[cur]) {
            if (e.second == last) {
                edgeUsed[e.first] = true;
                break;
            }
        }
    }
    return last;
}

vector<int> endTrick;

bool dfs3(int cur, int root, bool first = true) {
    if (cur == root && !first) return true;
    for (auto &e : adj[cur]) {
        if (lnk[e.second] != lnk[cur]) continue;
        if (vst[e.first]) continue;
        vst[e.first] = true;
        if (dfs3(e.second, root, false)) {
            endTrick.push_back(e.first);
            return true;
        }
    }
    return false;
}
    
    
int dfsPaths(int cur) {
    vst[cur] = true;
    int res = 0;
    for (auto &e : revAdj[cur]) {
        if (edgeUsed[e.first]) continue;
        if (vst[e.second]) {
            res += numPaths[e.second];
        }
        else {
            res += dfsPaths(e.second);
        }
    }
    return numPaths[cur] = res;
}
    
variant<bool, vector<int>> find_journey(int N, int M, vector<int> U, vector<int> V) {
    n = N; m = M;
    lnk = vector<int>(n);
    sz = vector<int>(n);
    acc = vector<int>(n);
    adj = vector<vector<pair<int, int>>>(n);
    revAdj = vector<vector<pair<int, int>>>(n);
    for (int i = 0; i < n; i++) lnk[i] = i;
    for (int i = 0; i < m; i++) {
        adj[U[i]].push_back({i, V[i]});
        revAdj[V[i]].push_back({i, U[i]});
    }
    edgeUsed = vector<bool>(m);
    vst = vector<bool>(n);
    for (int i = 0; i < n; i++) {
        if (vst[i]) continue;
        dfs1(i);
    }
    vst = vector<bool>(n);
    while (!stk.empty()) {
        ll cur = stk.top(); stk.pop();
        if (vst[cur]) continue;
        dfs2(cur, cur);
    }
    
    vst = vector<bool>(n);
    queue<ll> q;
    vector<int> revPath;
    vector<int> dist(n, 1 << 30);
    q.push(0);
    dist[0] = 0;
    ll comp = 0;
    while (!q.empty()) {
        ll cur = q.front(); q.pop();
        if (vst[cur]) continue;
        vst[cur] = true;
        if (sz[lnk[cur]] >= 2) {
            comp = cur;
            while (cur != 0) {
                for (auto &e : revAdj[cur]) {
                    if (dist[e.second] < dist[cur]) {
                        revPath.push_back(e.first);
                        cur = e.second;
                        break;
                    }
                }
            }

            //
vst = vector<bool>(m);
dfs3(comp, comp);
reverse(endTrick.begin(), endTrick.end());
vector<int> res;
for (int i = revPath.size()-1; i >= 0; i--) {
    res.push_back(revPath[i]);
}
for (int i = 0; i < endTrick.size(); i++) {
    res.push_back(endTrick[i]);
}
for (int i = 0; i < revPath.size(); i++) {
    res.push_back(revPath[i]);
}

for (int i = 0; i < revPath.size(); i++) {
    res.push_back(revPath[i]^1);
}
for (int i = endTrick.size()-1; i >= 0; i--) {
    res.push_back(endTrick[i]);
}
for (int i = 0; i < revPath.size(); i++) {
    res.push_back(revPath[i]^1);
}
return res;
            //
            break;
        }
        for (auto &e : adj[cur]) {
            if (vst[e.second]) continue;
            dist[e.second] = min(dist[e.second], dist[cur]+1);
            q.push(e.second);
        }
    }

    
    
    return false;
}
    
#ifdef TEST
#include "grader.cpp"
#endif

컴파일 시 표준 에러 (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:132:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  132 | for (int i = 0; i < endTrick.size(); i++) {
      |                 ~~^~~~~~~~~~~~~~~~~
islands.cpp:135:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  135 | for (int i = 0; i < revPath.size(); i++) {
      |                 ~~^~~~~~~~~~~~~~~~
islands.cpp:139:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  139 | for (int i = 0; i < revPath.size(); i++) {
      |                 ~~^~~~~~~~~~~~~~~~
islands.cpp:145:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  145 | for (int i = 0; i < revPath.size(); 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...