Pagini recente » Cod sursa (job #1670268) | Cod sursa (job #1209432) | Cod sursa (job #2498612) | Cod sursa (job #2910395) | Cod sursa (job #2919210)
#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;
}