| # | Time | Username | Problem | Language | Result | Execution time | Memory |
|---|---|---|---|---|---|---|---|
| 1324606 | eri16 | Thousands Islands (IOI22_islands) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100001;
int out_deg[MAXN];
vector<int> in_adj[MAXN];
vector<int> out_adj[MAXN];
char deleted[MAXN];
queue<int> events;
void delete_vertex(int x){
if (deleted[x]) return;
deleted[x]=1;
for (int p : in_adj[x]) {
out_deg[p]--;
if (out_deg[p]==0) events.push(p);
}
}
int extend_from(int v){
int last_next=-1;
for (int to : out_adj[v]){
if (deleted[to]) continue;
last_next=to;
}
delete_vertex(v);
return last_next;
}
pair<bool, vector<int>> find_journey_exists(int n, int m, const vector<int>& U, const vector<int>& V) {
vector <int> vvv;
for (int i=0; i<n; i++){
out_deg[i] = 0;
in_adj[i].clear();
out_adj[i].clear();
deleted[i] = 0;
}
while (!events.empty()) events.pop();
for (int i=0; i<m; i++){
out_adj[U[i]].push_back(V[i]);
out_deg[U[i]]++;
in_adj[V[i]].push_back(U[i]);
}
for (int i=0; i<n; i++)
if (out_deg[i]==0) events.push(i);
int current=0;
while (out_deg[current]<=1){
int next=extend_from(current);
if (next==-1)return false;
current=next;
}
while (!events.empty()){
int x=events.front();
events.pop();
if (deleted[x]) continue;
delete_vertex(x);
while (out_deg[current]<=1){
int next=extend_from(current);
if (next==-1) return false;
current=next;
}
}
return {true,vvv};
}