Cod sursa(job #1168165)

Utilizator mirceadinoMircea Popoveniuc mirceadino Data 7 aprilie 2014 10:35:28
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.85 kb
#include<cstdio>
#include<bitset>
#include<vector>

using namespace std;

const int NMAX = 100000+5;

void Read(),Solve(),Print();

int N,M;
vector<int> V[NMAX];
vector<int> S;
vector<int> Ciclu_Euler;
bitset<NMAX> Viz;

void DFS(int x)
{
    vector<int>::iterator it;

    S.push_back(x);
    Viz[x] = 1;

    while(!S.empty())
    {
        x = S.back();
        S.pop_back();

        for(it = V[x].begin(); it != V[x].end(); it++)
            if(!Viz[*it])
            {
                S.push_back(*it);
                Viz[*it] = 1;
            }
    }
}

int Eulerian()
{
    int i;

    DFS(1);

    for(i = 1; i <= N; i++)
        if(!Viz[i] || V[i].size()%2) return 0;

    return 1;
}

void Erase_Edge(int x,int y)
{
    vector<int>::iterator it;

    for(it = V[x].begin(); it != V[x].end(); it++)
        if(*it == y) break;

    swap(*it,V[x].back());
    V[x].pop_back();
}

int main()
{
    Read();
    Solve();
    Print();

    return 0;
}

void Read()
{
    int x,y,i;

    freopen("ciclueuler.in","r",stdin);
    freopen("ciclueuler.out","w",stdout);

    scanf("%d%d",&N,&M);

    for(i = 1; i <= M; i++)
    {
        scanf("%d%d",&x,&y);
        V[x].push_back(y);
        V[y].push_back(x);
    }
}

void Solve()
{
    int x,y;

    if(!Eulerian()) return;

    S.push_back(1);

    while(!S.empty())
    {
        x = S.back();

        if(V[x].empty())
        {
            Ciclu_Euler.push_back(x);
            S.pop_back();
            continue;
        }

        y = V[x].back();

        Erase_Edge(x,y);
        Erase_Edge(y,x);

        S.push_back(y);
    }
}

void Print()
{
    int i;

    if(Ciclu_Euler.empty())
    {
        printf("-1\n");
        return;
    }

    for(i = 1; i <= M; i++)
        printf("%d ",Ciclu_Euler[i]);
}