Cod sursa(job #761917)

Utilizator repp4raduRadu-Andrei Szasz repp4radu Data 27 iunie 2012 20:49:16
Problema Ciclu Eulerian Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.27 kb
#include <fstream>
#include <list>
#include <stack>
#include <queue>

#define MAX 100050

using namespace std;

list<int> E[MAX][11], L;
queue<int> Q;
stack<int> S;
int grad[MAX], n, m;
bool visited[MAX];


void citire()
{
    ifstream in("ciclueuler.in");
    in>>n>>m;
    int a, b;
    while(m--)
    {
        in>>a>>b;
        E[a][b / 10].push_back(b);
        grad[a]++;
        E[b][a / 10].push_back(a);
        grad[b]++;
    }
    in.close();
}

void bfs(int nod)
{
    Q.push(nod);
    while(!Q.empty())
    {
        int v = Q.front();
        Q.pop();
        for(int i = 0; i <= 10; i++)
        {
            for(list<int>::iterator it = E[v][i].begin(); it != E[v][i].end(); it++)
                if(!visited[*it])
                {
                    visited[*it] = true;
                    Q.push(*it);
                }
        }
    }
}

bool isEulerian()
{
    visited[1] = true;
    bfs(1);
    for(int i = 1; i <= n; i++)
        if(!visited[i] || (grad[i] & 1))
            return false;
    return true;
}

void sterge(int v, int w)
{
    grad[v]--;
    grad[w]--;
    E[v][w / 10].pop_front();
    for(list<int>::iterator it = E[w][v / 10].begin(); it != E[w][v / 10].end(); it++)
        if((*it) == v)
        {
            E[w][v / 10].erase(it);
            return;
        }
}

int isEmpty(list<int> W[])
{
    for(int i = 0; i <= 10; i++)
        if(!W[i].empty())
            return i;
    return -1;
}

void euler(int nod)
{
    int a;
    while((a = isEmpty(E[nod])) != -1)
    {
        int v = E[nod][a].front();
        S.push(nod);
        sterge(nod, v);
        nod = v;
    }
}

int solve()
{
    if(!isEulerian())
        return -1;
    else
    {
        int v = 1;
        do
        {
            euler(v);
            v = S.top();
            S.pop();
            L.push_back(v);
        }
        while(!S.empty());
        return 10;
    }
}

void afisare(int ok)
{
    ofstream out("ciclueuler.out");
    if(ok == -1)
        out<<"-1";
    else
    {
        for(list<int>::iterator it = L.begin(); it != L.end(); it++)
            out<<(*it)<<" ";
    }
    out.close();
}

int main()
{
    citire();
    afisare(solve());
    return 0;
}