Cod sursa(job #1627904)

Utilizator SlevySlevoaca Stefan-Gabriel Slevy Data 3 martie 2016 19:17:47
Problema Ciclu Eulerian Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 2.65 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 x,y;
    do
    {
        x = *(c.end()-1);
        y = *muchii[x].begin();
        grade[x]--;
        grade[y]--;
        c.push_back(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.begin())!= (*(c.end()-1)));
    while((int)c.size() < m)
   {
       int t = -1;
       for(unsigned int i=0;i<c.size();i++)
        if(grade[c[i]]!=0)
       {
           t = i;
           break;
       }
       c1.push_back(c[t]);

    do
    {
        x = *(c1.end()-1);
        y = *muchii[x].begin();
        grade[x]--;
        grade[y]--;
        c1.push_back(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.begin())!= (*(c1.end()-1)));
    c.insert(c.begin()+t+1,c1.begin()+1,c1.end());
    c1.clear();
   }
}

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