Cod sursa(job #1028401)

Utilizator macajouMaca George macajou Data 13 noiembrie 2013 22:56:59
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.24 kb
#include <cstdio>
#include <list>
#include <stack>
#include <queue>
#define nmax 100010

using namespace std;

int n,m;
list<int> a[nmax],sol;
stack<int> s;
int grad[nmax],viz[nmax];

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

}

queue<int> q;
void BFS(int vf)
{
    int v;
    typeof(a[vf].begin()) i;
    q.push(vf);
    while(!q.empty())
          {
              vf=q.front();
              q.pop();
              for(i=a[vf].begin();i!=a[vf].end();i++)
                  {
                      v=*i;
                      if(!viz[v])
                         {
                             q.push(v);
                             viz[v]=1;
                         }
                  }
          }
}

bool este_conex()
{
    BFS(1);
    for(int i=2;i<=n;i++)
        if(!viz[i])
           return 0;
    return 1;
}

bool grad_par()
{
    for(int i=1;i<=n;i++)
        if(grad[i]%2==1)
           return 0;
    return 1;
}

void sterge(int vf, int v)
{
    grad[vf]--;
    grad[v]--;
    a[vf].pop_front();
    for(typeof(a[v].begin()) i=a[v].begin();i!=a[v].end();i++)
        if(vf==*i)
           {
               a[v].erase(i);
               break;
           }
}

void euler(int vf)
{
    int v;
    while(grad[vf])
          {
              v=a[vf].front();
              s.push(vf);
              sterge(vf,v);
              vf=v;
          }
}

void caut_ciclu()
{
    int vf=1;
    do
      {
          euler(vf);
          vf=s.top();
          s.pop();
          sol.push_back(vf);
      }while(!s.empty());
}

void afisare()
{
    typeof(sol.begin()) i;
    for(i=sol.begin();i!=sol.end();i++)
        printf("%d ",*i);
}

void rez()
{
    if(!este_conex())
        printf("-1");
    else if(!grad_par)
        printf("-1");
    else
        {
            caut_ciclu();
            afisare();
        }
}

int main()
{
    freopen("ciclueuler.in","r",stdin);
    freopen("ciclueuler.out","w",stdout);

    citire();
    rez();

    return 0;
}