Cod sursa(job #2616964)

Utilizator david.teacaDavid Stefan Teaca david.teaca Data 20 mai 2020 14:15:45
Problema Santa Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.22 kb
#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 << ' ';
{1}
    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;
}