Cod sursa(job #899705)

Utilizator priestnoobFMI - Dan Nema priestnoob Data 28 februarie 2013 15:52:50
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 kb
#include<stdio.h>
#include<list>
#include <stack>
#include <queue>

using namespace std;

#define TR( C, it ) \
    for( typeof(C.begin()) it = C.begin(); it != C.end(); it++ )
#define nmax 100010
#define pb push_back

int n,m, deg[ nmax ], col[ nmax ];
list<int> graf[nmax], l;
stack< int > s;
queue< int > q;

void cit()
{
    int u,v;
    scanf("%i%i",&n,&m);
    while(m--)
    {
        scanf("%d%d",&u,&v);
        graf[u].pb(v); ++deg[u];
        graf[v].pb(u); ++deg[v];
    }
}

void bfs(int v)
{
    q.push(v); col[v]=1;
    while(!q.empty()){
        v=q.front(); q.pop();
        TR( graf[v],w )
            if(!col[*w])
            q.push(*w),col[*w]=1;
}
}

int esteconex()
{
    bfs(1);
    for(int i=1;i!= n;i++)
    {
        if(!col[i])
        return 0;
    }
    return 1;
}

int eulerian()
{
    if(!esteconex())
    return 0;
    for(int i=1;i<=n;i++)
    {
        if(deg[i]%2)
        return 0;
    }
    return 1;
}

void sterge (int i, int j)
{
    --deg[i];
    --deg[j];
    graf[i].pop_front();
    TR(graf[j],it)
    if(*it==i)
        {
            graf[j].erase(it);
            break;
        }
}

void euler(int i)
{
    while(true)
    {
        if(graf[i].empty())
        break;
        int j=graf[i].front();
        s.push(i);
        sterge(i,j);
        i=j;
    }
}

int rez()
{
    int i=eulerian();
    if(!i)
    return(-1);
    do
    {
        euler(i);
        i=s.top();
        s.pop();
        l.pb(i);
    } while(!s.empty());
    return 1;
}

void scr(int i)
{
    if(i==-1)
        printf("-1");
    else
    {
        TR(l, i)
        printf("%d", *i);
    }
}



int main()
{
    freopen("ciclueuler.in","r",stdin);
    freopen("ciclueuler.out","w",stdout);
    cit();
    scr(rez());
}