Cod sursa(job #1626328)

Utilizator SlevySlevoaca Stefan-Gabriel Slevy Data 3 martie 2016 00:56:29
Problema Ciclu Eulerian Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.75 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];
int grade[NMAX];
vector<int> c;
vector<int> c1;

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 ok()
{
    int check= 1;
    for(int i=1;i<=n;i++)
    if((grade[i]%2==1) || (grade[i]==0))
    {
        check = 0;
        break;
    }
    return check;
}

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,c1.begin(),c1.end()-1);
    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;
}