Cod sursa(job #2611659)

Utilizator Mihai145Oprea Mihai Adrian Mihai145 Data 7 mai 2020 12:33:30
Problema Santa Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.17 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 << ' ';

    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;
}