Cod sursa(job #2919210)

Utilizator lolismekAlex Jerpelea lolismek Data 16 august 2022 14:51:35
Problema Santa Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.66 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
#include <algorithm>

using namespace std;

ifstream fin("santa.in");
ofstream fout("santa.out");

const int N = 45000;
vector <int> adj[N + 1];

int n, m, S, E, Q;
int depth[N + 1], lowLink[N + 1];
bool ok[N + 1];
stack <int> stiva;

vector <vector <int>> comp;
vector <int> critic;

void findBiconex(int nod, int parent){
	lowLink[nod] = depth[nod] = depth[parent] + 1;
	stiva.push(nod);

	ok[nod] = (nod == E ? true : ok[nod]);

	for(auto vec : adj[nod])
		if(vec != parent){
			if(depth[vec] != 0)
				lowLink[nod] = min(lowLink[nod], depth[vec]);
			else{
				findBiconex(vec, nod);
				ok[nod] = (ok[vec] == true ? ok[vec] : ok[nod]);
				lowLink[nod] = min(lowLink[nod], lowLink[vec]);
				if(depth[nod] <= lowLink[vec]){
					vector <int> aux;
					while(stiva.top() != vec)
						aux.push_back(stiva.top()), stiva.pop();
					aux.push_back(vec), stiva.pop();
					aux.push_back(nod);

					if(ok[vec])
						comp.push_back(aux), critic.push_back(nod);
				}
			}
		}

}

bool interest[N + 1];
vector <int> ans;

bool Find(int start, int end, int size, bool status){
	interest[start] = false;

	if(status)
		ans.push_back(start);
	
	if(size == 1)
		if(start == end || end == 0)
			return true;

	if(size == 1 || start == end){
		interest[start] = true;
		if(status)
			ans.pop_back();
		return false;
	}

	for(auto vec : adj[start])
		if(interest[vec] && Find(vec, end, size - 1, 1))
			return true;

	if(status)
		ans.pop_back();
	interest[start] = true;

	return false;
}

int main(){

	fin >> n >> m;

	for(int i = 1; i <= m; i++){
		int a, b;
		fin >> a >> b;
		adj[a].push_back(b);
		adj[b].push_back(a);
	}

	fin >> S >> E >> Q;

	critic.push_back(Q);
	findBiconex(S, 0);

	bool normal = false;
	for(auto nod : comp[0])
		normal |= (nod == Q);

	if(!normal) // incepem din comp lui E
		reverse(comp.begin(), comp.end()),
		reverse(critic.begin(), critic.end());

	normal = false;
	for(auto nod : comp[0])
		normal |= (nod == Q);

	if(!normal){
		fout << "No chance\n";
		return 0;
	}

	critic[0] = Q, critic[(int)critic.size() - 1] = 0; // ?
	

	for(auto C : comp)
		for(auto nod : C)
			interest[nod] = true;

	for(int i = 0; i < (int)comp.size(); i++){
		interest[critic[i]] = true;
		if(!Find(critic[i], critic[i + 1], (int)comp[i].size(), 1)){
			fout << "No chance\n";
			return 0;
		}

		if(i != (int)comp.size() - 1)
			ans.pop_back();

		for(auto nod : comp[i])
			interest[nod] = false;
	}

	fout << (int)ans.size() << '\n';
	for(auto nod : ans)
		fout << nod << ' ';

	return 0;
}