제출 #1348409

#제출 시각아이디문제언어결과실행 시간메모리
1348409inesfiSimurgh (IOI17_simurgh)C++20
0 / 100
7 ms2056 KiB
#include "simurgh.h"
#include<bits/stdc++.h>
using namespace std;

//int common = count_common_roads(r);

const int TAILLEMAXI=250, EN_COURS=1, FINI=2;
vector<int> adja[TAILLEMAXI];
vector<pair<int,int>> aretes;
int dejavu[TAILLEMAXI];
vector<int> cycle;
vector<int> pile;
vector<int> royal; /// 0=jsp, 1=oui, 2=non
bool stop;
vector<int> parent;

int trouver(int a){
	if (parent[a]!=a){
		parent[a]=trouver(parent[a]);
	}
	return parent[a];
}

void unir(int a, int b){
	parent[trouver(a)]=parent[trouver(b)];
}

int autre(int num_ar, int ec){
	if (ec==aretes[num_ar].first){
		return aretes[num_ar].second;
	}
	return aretes[num_ar].first;
}

void dfs(int pos, int vient){
	if (stop){
		return ;
	}
	if (dejavu[pos]==FINI){
		return ;
	}
	if (dejavu[pos]==EN_COURS){
		cycle.push_back(pile.back());
		pile.pop_back();
		while (aretes[pile.back()].first!=pos and aretes[pile.back()].second!=pos){
			cycle.push_back(pile.back());
			pile.pop_back();
		}
		cycle.push_back(pile.back());
		stop=true;
		return ;
	}
	dejavu[pos]=EN_COURS;
	for (auto a:adja[pos]){
		if (a!=vient and royal[a]!=1){
			pile.push_back(a);
			dfs(autre(a, pos), a);
			if (!stop){
				pile.pop_back();
			}
		}
	}
	dejavu[pos]=FINI;
}

vector<int> find_roads(int n, vector<int> u, vector<int> v) {
	int nbaretes=u.size();
	royal.resize(nbaretes);
	for (int i=0;i<nbaretes;i++){
		aretes.push_back({u[i], v[i]});
		adja[u[i]].push_back(i);
		adja[v[i]].push_back(i);
	}
	while (1>0){
		cycle.clear();
		pile.clear();
		stop=false;
		for (int i=0;i<n;i++){
			dejavu[i]=0;
		}
		for (int i=0;i<n;i++){
			dfs(i, -1);
		}
		/*for (auto c:cycle){
			cout<<c<<" ";
		}
		cout<<endl;*/
		if (cycle.empty()){
			vector<int> rep;
			for (int i=0;i<nbaretes;i++){
				if (royal[i]!=1){
					rep.push_back(i);
					//cout<<i<<endl;
				}
			}
			return rep;
		}
		parent.clear();
		for (int i=0;i<n;i++){
			parent.push_back(i);
		}
		for (auto a:cycle){
			unir(aretes[a].first, aretes[a].second);
		}
		vector<int> encours;
		for (int i=0;i<nbaretes;i++){
			if (trouver(aretes[i].first)!=trouver(aretes[i].second)){
				unir(aretes[i].first, aretes[i].second);
				encours.push_back(i);
			}
		}
		vector<int> val;
		int val_min=TAILLEMAXI;
		for (auto a:cycle){
			for (auto x:cycle){
				if (x!=a){
					encours.push_back(x);
				}
			}
			int v=count_common_roads(encours);
			//cout<<v<<endl;
			val.push_back(v);
			val_min=min(val_min, v);
			for (int i=0;i<(int)cycle.size()-1;i++){
				encours.pop_back();
			}
		}
		for (int i=0;i<(int)cycle.size();i++){
			if (val[i]==val_min){
				royal[cycle[i]]=2;
				//cout<<"oui "<<cycle[i]<<endl;
			}
			else {
				royal[cycle[i]]=1;
				//cout<<"non "<<cycle[i]<<endl;
			}
		}
	}
	//return {0};
}
#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...