Cod sursa(job #1627998)

Utilizator SlevySlevoaca Stefan-Gabriel Slevy Data 3 martie 2016 20:09:36
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.74 kb
#include <bits/stdc++.h>

using namespace std;

const int NMAX = 100001;
const int MMAX = 200001;
int n,m;
vector<int> muchii[MMAX];
vector<int>::iterator it;
int grade[NMAX];
vector<int> c;
vector<int> c1;
queue<int> coada;
bitset<NMAX> mark;

void citire()
{
    scanf("%d %d",&n,&m);
    int x,y;
    for(int i=1;i<=m;i++)
    {
       scanf("%d %d",&x,&y);
        muchii[x].push_back(y);
        muchii[y].push_back(x);
    }
    fclose(stdin);
}

void grad()
{
    for(int i=1;i<=n;i++)
        for(it=muchii[i].begin();it!=muchii[i].end();it++)
        grade[*it]++;
}

int bfs();

int ok()
{
    int check= 1;
    for(int i=1;i<=n;i++)
    if(grade[i]%2==1)
    {
        check = 0;
        break;
    }
    if(check && bfs()==n)
        return 1;
    return 0;
}

int bfs()
{
    coada.push(1);
    mark.set(1);
    int x;
    int nr = 1;
    while(!coada.empty())
    {
        x = coada.front();
        for(it=muchii[x].begin();it!=muchii[x].end();it++)
            if(!mark.test(*it))
            {
                coada.push(*it);
                nr++;
                mark.set(*it);
            }
        coada.pop();
    }
    return nr;
}

void euler()
{
    c.push_back(1);
    int k = 0;
    int x,y;
    do
    {
        x = c[k];
        y = muchii[x][0];
        k++;
        c.push_back(y);
        grade[x]--;
        grade[y]--;
        muchii[x].erase(muchii[x].begin());
        for(it = muchii[y].begin();it!=muchii[y].end();it++)
            if(*it == x)
        {
            muchii[y].erase(it);
            break;
        }
    }while(c[k]!=c[0]);
    int t;
    while(k<m)
    {
            for(it = c.begin();it!=c.end();it++)
                if(grade[*it] > 0)
            {
                t = it - c.begin();
                c1.push_back(*it);
                break;
            }
            int l = 0;
    do
    {
        x = c1[l];
        y = muchii[x][0];
        l++;
        c1.push_back(y);
        grade[x]--;
        grade[y]--;
        muchii[x].erase(muchii[x].begin());
        for(it = muchii[y].begin();it!=muchii[y].end();it++)
            if(*it == x)
        {
            muchii[y].erase(it);
            break;
        }
    }while(c1[l]!=c1[0]);
    c.insert(c.begin()+t+1,c1.begin()+1,c1.end());
    k+=l;
    c1.clear();
    }
}

int main()
{
    freopen("ciclueuler.in","r",stdin);
    freopen("ciclueuler.out","w",stdout);
    citire();
    grad();
    if(!ok())
        printf("%d\n",-1);
        else
        {
            euler();
            for(it = c.begin();it!=c.end()-1;it++)
               printf("%d ",*it);
               printf("\n");
        }
        fclose(stdout);
    return 0;
}