Submission #1014313

#TimeUsernameProblemLanguageResultExecution timeMemory
1014313JakobZorzLongest Trip (IOI23_longesttrip)C++17
60 / 100
228 ms848 KiB
#include"longesttrip.h"
#include<iostream>
using namespace std;

int n;

pair<int,int>find_conn(vector<int>v1,vector<int>v2){
    for(int i:v1){
        if(are_connected({i},v2)){
            for(int j:v2){
                if(are_connected({i},{j}))
                    return{i,j};
            }
        }
    }
    // impossible
    exit(1);
}

vector<int>longest_trip(int N,int D){
    n=N;
    vector<int>res={0};
    vector<bool>vis(n);
    vis[0]=true;
    while(true){
        int node=res.back();
        //cout<<"VIS "<<node<<"\n";
        for(int ne=0;ne<n;ne++){
            if(!vis[ne]&&are_connected({node},{ne})){
                res.push_back(ne);
                break;
            }
        }
        vis[res.back()]=true;
        if(node==res.back())
            break;
    }
    vector<int>res2;
    for(int j=0;j<n;j++)
        if(!vis[j])
            res2.push_back(j);
    // all unvisited are strongly connected
    if(res2.size()&&are_connected(res,res2)){
        pair<int,int>conn=find_conn(res,res2);
        int i=0;
        while(res[i]!=conn.first)
            i++;
        int ne=conn.second;
        
        vector<int>res2;
        for(int j=0;j<n;j++)
            if(!vis[j]&&j!=ne)
                res2.push_back(j);
        res2.push_back(ne);
        for(int j=i;j<(int)res.size();j++)
            res2.push_back(res[j]);
        for(int j=0;j<i;j++)
            res2.push_back(res[j]);
        return res2;
    }
    if(res.size()>res2.size()){
        return res;
    }else{
        return res2;
    }
}
#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...