Cod sursa(job #1718561)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 18 iunie 2016 12:16:47
Problema Santa Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.78 kb
#include<cstdio>
#include<vector>
#include<stack>
#include<algorithm>
#define MAXN 54010
#define DIM 8192
using namespace std;
vector<int> g[MAXN],component[MAXN],criticals,solution;
stack<int> Stack;
int depth[MAXN],position=0,low[MAXN],components=0,seen[MAXN],isCritical[MAXN],access[MAXN];
char buffer[DIM];
int minimum(int a,int b){
    if(a<b)
        return a;
    return b;
}
void CreateComponent(int node,int son){
    if(access[son]==0){
        while(!Stack.empty()&&Stack.top()!=son)
            Stack.pop();
        Stack.pop();
        return;
    }
    components++;
    criticals.push_back(node);
    while(Stack.top()!=son){
        component[components].push_back(Stack.top());
        Stack.pop();
    }
    Stack.pop();
    component[components].push_back(son);
    component[components].push_back(node);
}
void DFS(int node,int father){
    int i;
    depth[node]=low[node]=depth[father]+1;
    seen[node]=1;
    for(i=0;i<g[node].size();i++)
        if(g[node][i]!=father)
            if(seen[g[node][i]]==0){
                Stack.push(g[node][i]);
                DFS(g[node][i],node);
                low[node]=minimum(low[node],low[g[node][i]]);
                access[node]|=access[g[node][i]];
                if(low[g[node][i]]>=depth[node])
                    CreateComponent(node,g[node][i]);
            }
            else
                low[node]=minimum(low[node],depth[g[node][i]]);
}
bool Hamilton(int level,int nodes,int node,int finish){
    int i;
    seen[node]=1;
    if(level>1)
        solution.push_back(node);
    if(level==nodes){
        if(finish==0||node==finish)
            return true;
        seen[node]=0;
        solution.pop_back();
        return false;
    }
    for(i=0;i<g[node].size();i++)
        if(seen[g[node][i]]==0&&(level==nodes-1||g[node][i]!=finish)&&Hamilton(level+1,nodes,g[node][i],finish)==true)
            return true;
    seen[node]=false;
    solution.pop_back();
    return false;
}
void SolveBiconex(int index,int start,int finish){
    int i;
    for(i=0;i<component[index].size();i++)
        seen[component[index][i]]=0;
    if(Hamilton(1,component[index].size(),start,finish)==false){
        printf("No chance");
        exit(0);
    }
}
void read(int &number){
    number=0;
    while(buffer[position]<'0'||buffer[position]>'9'){
        position++;
        if(position==DIM){
            fread(buffer,1,DIM,stdin);
            position=0;
        }
    }
    while(buffer[position]>='0'&&buffer[position]<='9'){
        number=number*10+buffer[position]-'0';
        position++;
        if(position==DIM){
            fread(buffer,1,DIM,stdin);
            position=0;
        }
    }
}
int main(){
    freopen("santa.in","r",stdin);
    freopen("santa.out","w",stdout);
    int n,m,i,x,y,s,e,q;
    fread(buffer,1,DIM,stdin);
    read(n);
    read(m);
    for(i=1;i<=m;i++){
        read(x);
        read(y);
        g[x].push_back(y);
        g[y].push_back(x);
    }
    read(s);
    read(e);
    read(q);
    access[s]=1;
    criticals.push_back(s);
    DFS(e,0);
    if(access[e]==0){
        printf("No chance");
        return 0;
    }
    if(find(component[1].begin(),component[1].end(),q)==component[1].end()){
        reverse(component[1].begin()+1,component[1].end());
        reverse(criticals.begin(),criticals.end());
    }
    if(find(component[1].begin(),component[1].end(),q)==component[1].end()){
        printf("No chance");
        return 0;
    }
    criticals[0]=q;
    criticals.back()=0;
    solution.push_back(q);
    for(i=1;i<=components;i++)
        SolveBiconex(i,criticals[i-1],criticals[i]);
    printf("%d\n",solution.size());
    for(i=0;i<solution.size();i++)
        printf("%d ",solution[i]);
    return 0;
}