Cod sursa(job #1627001)

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

using namespace std;

ifstream in("ciclueuler.in");
ofstream out("ciclueuler.out");
const int NMAX = 100001;
int n,m;
multiset<int> muchii[NMAX];
multiset<int>::iterator it;
int grade[NMAX];
vector<int> c;
vector<int> c1;
queue<int> coada;
bitset<NMAX> mark;

void citire()
{
    in>>n>>m;
    int x,y;
    for(int i=1;i<=m;i++)
    {
        in>>x>>y;
        grade[x]++;
        grade[y]++;
        muchii[x].insert(y);
        muchii[y].insert(x);
    }
    in.close();
}

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

int main()
{
    citire();
    if(!ok())
        out<<-1;
        else
        {
            euler();
            for(unsigned int i = 0;i<c.size()-1;i++)
                out<<c[i]<<" ";
        }
        out.close();
    return 0;
}