Cod sursa(job #1046196)

Utilizator mirceadinoMircea Popoveniuc mirceadino Data 2 decembrie 2013 18:59:23
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 kb
#include<cstdio>
#include<bitset>
#include<vector>
#include<deque>
#define NMAX 100000+5
using namespace std;
int N,M;
int Grad[NMAX];
vector<int> V[NMAX];
vector<int> S;
deque<int> Q;
bitset<NMAX> viz;
bool eulerian()
{
    int x,i;
    vector<int>::iterator it;
    //BFS din 1
    Q.push_back(1);
    viz[1]=1;
    for(;!Q.empty();)
    {
        x=Q.front();
        Q.pop_front();
        for(it=V[x].begin();it!=V[x].end();it++)
        {
            if(viz[*it]) continue;
            viz[*it]=1;
            Q.push_back(*it);
        }
    }
    //Este conex si gradele sunt pare?
    for(i=1;i<=N;i++)
        if(viz[i]==0 || Grad[i]%2) return 0;
    return 1;
}
void scrieCiclu()
{
    int x,y;
    vector<int>::iterator it;
    Q.push_back(1);
    for(;!Q.empty();)
    {
        x=Q.back();
        if(Grad[x])
        {
            y=V[x].back();
            V[x].pop_back();
            for(it=V[y].begin();it!=V[y].end();it++)
                if(*it==x)
                {
                    swap(*it,V[y].back());
                    V[y].pop_back();
                    break;
                }
            Q.push_back(y);
            Grad[x]--;
            Grad[y]--;
        }
        else
        {
            S.push_back(Q.back());
            Q.pop_back();
        }
    }
    for(it=S.begin();it!=S.end();it++)
        printf("%d ",*it);
}
int main()
{
    int a,b;
    freopen("ciclueuler.in","r",stdin);
    freopen("ciclueuler.out","w",stdout);
    scanf("%d%d",&N,&M);
    for(;M;--M)
    {
        scanf("%d%d",&a,&b);
        V[a].push_back(b); Grad[a]++;
        V[b].push_back(a); Grad[b]++;
    }
    if(eulerian()) scrieCiclu();
    else printf("-1\n");
    return 0;
}