Pagini recente » Cod sursa (job #2481317) | Cod sursa (job #178715) | Cod sursa (job #2174365) | Cod sursa (job #1754902) | Cod sursa (job #2611659)
#include <fstream>
#include <vector>
#include <stack>
#include <algorithm>
#include <cstdlib>
using namespace std;
ifstream cin("santa.in");
ofstream cout("santa.out");
const int NMAX = 45000;
int N, M, S, E, Q;
vector <int> g[NMAX + 2];
bool mustVisit[NMAX + 2];
int tmp[NMAX + 2], lowtmp[NMAX + 2];
stack <int> st;
vector <int> artP;
vector < vector <int> > bix;
bool seen[NMAX + 2];
void popcomp(int artPoint, int son)
{
if(!mustVisit[son])
{
while(st.top() != son)
st.pop();
st.pop();
return;
}
artP.push_back(artPoint);
vector <int> comp;
do
{
comp.push_back(st.top());
st.pop();
}
while(comp.back() != son);
comp.push_back(artPoint);
bix.push_back(comp);
}
void dfs(int node, int dady)
{
tmp[node] = lowtmp[node] = tmp[dady] + 1;
st.push(node);
for(auto it : g[node])
if(it != dady)
{
if(tmp[it] > 0)
{
lowtmp[node] = min(lowtmp[node], tmp[it]);
continue;
}
dfs(it, node);
lowtmp[node] = min(lowtmp[node], lowtmp[it]);
mustVisit[node] |= mustVisit[it];
if(tmp[node] <= lowtmp[it])
popcomp(node, it);
}
}
vector <int> path;
bool bkt(int l, int bcsz, int node, int lst)
{
seen[node] = true;
if(l > 1)
path.push_back(node);
if(l == bcsz)
{
if(node == lst || lst == 0)
return true;
path.pop_back();
seen[node] = false;
return 0;
}
for(auto it : g[node])
if(seen[it] == false && (it != lst || l == bcsz - 1) && bkt(l + 1, bcsz, it, lst))
return 1;
path.pop_back();
seen[node] = false;
return 0;
}
void fail()
{
cout << "No chance\n";
exit(0);
}
int main()
{
cin >> N >> M;
for(int i = 1; i <= M; i++)
{
int x, y;
cin >> x >> y;
g[x].push_back(y);
g[y].push_back(x);
}
cin >> S >> E >> Q;
mustVisit[S] = true;
artP.push_back(S);
dfs(E, 0);
if(mustVisit[E] == false)
{
//cout << "1\n";
fail();
}
/*
for(int i = 0; i < bix.size(); i++)
{
for(auto it : bix[i])
cout << it << ' ';
cout << '\n';
}
*/
if(find(bix[0].begin(), bix[0].end(), Q) == bix[0].end())
{
reverse(bix.begin(), bix.end());
reverse(artP.begin(), artP.end());
}
if(find(bix[0].begin(), bix[0].end(), Q) == bix[0].end())
{
//cout << "2\n";
fail();
}
artP.back() = 0;
artP[0] = Q;
path.push_back(Q);
for(int i = 0; i <= N; i++)
seen[i] = true;
for(int i = 0; i < bix.size(); i++)
{
for(auto it : bix[i])
seen[it] = false;
if(!bkt(1, bix[i].size(), artP[i], artP[i + 1]))
{
//cout << "3\n";
fail();
}
}
cout << path.size() << '\n';
for(auto it : path)
cout << it << ' ';
return 0;
}