제출 #694923

#제출 시각아이디문제언어결과실행 시간메모리
69492379brue수천개의 섬 (IOI22_islands)C++17
35 / 100
329 ms34660 KiB
#include "islands.h"
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

int n, m;
multiset<int> link[100002], revLink[100002];

bool removeUselessVertices();

variant<bool, vector<int>> find_journey(int N, int M, vector<int> U, vector<int> V){
    n = N, m = M;
    for(int i=0; i<m; i++){
        link[U[i]].insert(V[i]);
        revLink[V[i]].insert(U[i]);
    }

    if(removeUselessVertices()) return false;
    return true;
}

int deg[100002];
bool removed[100002];
bool seenAsStart[100002];
int s = 0;
vector<int> startList;

bool removeUselessVertices(){
    /// outdegree 0 삭제
    queue<int> que;
    for(int i=0; i<n; i++){
        deg[i] = (int)link[i].size();
        if(!deg[i] && !removed[i]) removed[i] = 1, que.push(i);
    }
    while(deg[s] == 1){
        for(auto y: revLink[s]){
            link[y].erase(link[y].find(s));
            deg[y]--;
            if(!deg[y] && !removed[y]) removed[y] = 1, que.push(y);
        }
        revLink[s].clear();
        startList.push_back(s);
        s = *link[s].begin();
    }

    while(!que.empty()){
        int x = que.front(); que.pop();
        deg[x] = 0;
        for(auto y: revLink[x]){
            deg[y]--;
            link[y].erase(link[y].find(x));

            if(!deg[y] && !removed[y]) removed[y] = 1, que.push(y);
            while(deg[s] == 1){
                for(auto y: revLink[s]){
                    link[y].erase(link[y].find(s));
                    deg[y]--;
                    if(!deg[y] && !removed[y]) removed[y] = 1, que.push(y);
                }
                revLink[s].clear();
                startList.push_back(s);
                s = *link[s].begin();
            }
        }
    }

    if(removed[s]) return true;

    return false;
}
#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...