Cod sursa(job #1028413)

Utilizator macajouMaca George macajou Data 13 noiembrie 2013 23:38:13
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.56 kb
#include <cstdio>
#include <stack>
#include <vector>
#include <queue>
#define nmax 100010

using namespace std;

struct nod
{
    int inf;
    nod *urm;
};

nod *a[nmax];

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

void adaug(nod *&pr, int x)
{
    nod *nou;
    nou=new nod;
    nou->inf=x;
    nou->urm=pr;
    pr=nou;
}

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]++;
            adaug(a[x],y);
            adaug(a[y],x);
        }

}

queue<int> q;
void BFS(int vf)
{
    int v;
    nod *c;
    q.push(vf);
    while(!q.empty())
          {
              vf=q.front();
              q.pop();
              for(c=a[vf];c;c=c->urm)
                  {
                      v=c->inf;
                      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]=a[vf]->urm;
    nod *c,*pred;
    for(c=a[v];c;c=c->urm)
        {
            if(vf==c->inf)
           {
               if(c->inf==a[v]->inf)
                  a[v]=a[v]->urm;
               else
                   {
                       pred->urm=c->urm;
                       delete c;
                   }
               break;
           }
            pred=c;
        }
}

void euler(int vf)
{
    int v;
    while(grad[vf])
          {
              v=a[vf]->inf;
              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()
{
    for(int i=0;i<sol.size();i++)
        printf("%d ",sol[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;
}