#include "islands.h"
#include <map>
#include <variant>
#include <vector>
#include <algorithm>
using namespace std;
#define pb push_back
#define mp make_pair
variant<bool, vector<int>> find_journey(int N, int M, vector<int> U, vector<int> V) {
vector<int> answer;
if(N==2){ // subtask 1
vector<int> A, B;
for(int i=0; i<M; i++){
if(U[i]==0 && V[i]==1){
A.pb(i);
} else{
B.pb(i);
}
}
if(A.size()>1 && B.size()>0){
answer = {A[0], B[0], A[1], A[0], B[0], A[1]};
return answer;
} else{
return false;
}
}
// subtask 3 (21 marks)
vector<vector<int>> adj(N);
map<pair<int, int>, int> can;
int u,v;
for(int i=0; i<M; i++){
u=U[i];
v=V[i];
adj[u].pb(v);
can[mp(u,v)]=i;
}
if(adj[0].size() > 1){
// simple case (same as subtask 2)
answer = {can[mp(0, adj[0][0])], can[mp(adj[0][0], 0)],
can[mp(0, adj[0][1])], can[mp(adj[0][1], 0)],
can[mp(adj[0][0], 0)], can[mp(0, adj[0][0])],
can[mp(adj[0][1], 0)], can[mp(0, adj[0][1])]};
return answer;
}
if(adj[0].size() == 0)return false;
// complex case
int cur = adj[0][0];
int prev = 0;
vector<int> beforetrip={ can[mp(prev, cur)] };
vector<int> aftertrip= { can[mp(cur, prev)] };
vector<int> trip;
while(true){
if(adj[cur].size()==1){
return false;
} else if(adj[cur].size()==2){
if(adj[cur][0]==prev){
prev = cur;
cur = adj[cur][1];
} else{
prev = cur;
cur = adj[cur][0];
}
beforetrip.pb( can[mp(prev,cur)] );
aftertrip.pb( can[mp(cur,prev)] );
} else{
// we have the trip!
int A=cur,B,C; // find B,C which are NOT prev
if(adj[cur][0]==prev){
B = adj[cur][1];
C = adj[cur][2];
} else if(adj[cur][1]==prev){
B = adj[cur][0];
C = adj[cur][2];
} else{
B = adj[cur][0];
C = adj[cur][1];
}
int AB,BA,AC,CA; // find canoes between AB and AC
AB = can[mp(A,B)];
BA = can[mp(B,A)];
AC = can[mp(A,C)];
CA = can[mp(C,A)];
trip = {AB,BA,AC,CA,BA,AB,CA,AC};
for(int i=0; i<beforetrip.size(); i++){
answer.pb(beforetrip[i]);
}
for(int i=0; i<trip.size(); i++){
answer.pb(trip[i]);
}
for(int i=aftertrip.size()-1; i>-1; i--){
answer.pb(aftertrip[i]);
}
return answer;
}
}
return false;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |