Cod sursa(job #918537)

Utilizator Theorytheo .c Theory Data 18 martie 2013 22:45:58
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.09 kb
#include<fstream>
#include<vector>
#include<cstdlib>

using namespace std;

ifstream fin("domino.in");
ofstream fout("domino.out");

const int Nmax = 500005;

int N, M; bool Visited[11]; int In[Nmax]; int Out[Nmax]; bool Mark[Nmax];int Start; bool EdgeVisit[Nmax];

int Many[Nmax];bool Rotate[Nmax]; int Dim[Nmax];int Number;

vector<int> G[12];

void Read() {

    fin >> N >> M;
    for(int i = 1; i <= M; ++i){

       fin >> In[i] >> Out[i];

       G[In[i]].push_back(i);
       G[Out[i]].push_back(i);

    }
}

bool EulerianGraph() {

    for(int i = 0; i < 10; ++i)
        if(G[i].size() % 2) return false;

    for(int i = 0; i < 10; ++i)
        if(G[i].size()) Start = i;

    return true;
}


void DeepFirstS(const int Node){

    Visited[Node] = true;

    for(int i = 0; i < G[Node].size(); ++i){

        int X = In[G[Node][i]] + Out[G[Node][i]] - Node;

        if(Visited[X] == false){

            Mark[G[Node][i]] = true;
            DeepFirstS(X);
        }
    }
}

void Euler(const int Node){

    for(int i = 0 ;i < G[Node].size(); ++i)
        if(EdgeVisit[G[Node][i]] == false && ( (Many[Node] > 0 && Mark[G[Node][i]] == false) || (Many[Node] <= 0) ) ){

            int X = In[G[Node][i]] + Out[G[Node][i]] - Node;
            EdgeVisit[G[Node][i]] = true;
            Many[X]-= 2;


            ++Number;

            if(Node == In[G[Node][i]])
                Rotate[Number] = false;
            else Rotate[Number] = true;

            Dim[Number] = G[Node][i];

            fout <<X <<" ";

            Euler(X);

        }
}


void Print(){

    fout << "1"<<'\n';
    for(int i = 1; i <= N; ++i)
        fout << Dim[i] <<" "<< Rotate[i]<<'\n';
}

int main(){

    Read();

    if(EulerianGraph() == false){
        fout << -1; exit(0);
    }

    DeepFirstS(1);

    for(int i = 0; i < 10; ++i)
        for(int X = 0 ; X < G[i].size(); ++X)
            if(Mark[G[i][X]] == false)  Many[In[G[i][X]]]++, Many[Out[G[i][X]]]++;


    Euler(1);

    //Print();

    fin.close();

    return 0;
}