Cod sursa(job #1815753)

Utilizator alex.craciunCraciun Alexandru alex.craciun Data 25 noiembrie 2016 18:42:29
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include <iostream>
#include <cstdio>
#include <vector>
#include <stack>
using namespace std;
struct muchii
{
    int nod1,nod2;
    bool used=1;
}v[500005];
vector <int> lv[500005],c;
stack <int> s;
FILE *f=fopen("ciclueuler.in","r");
int n,m,grad[500005];
void citire( )
{
    fscanf(f,"%d%d",&n,&m);
    for(int i=1;i<=m;i++)
    {
        int x,y;
        fscanf(f,"%d%d",&x,&y);
        ++grad[x];
        ++grad[y];
        lv[x].push_back(i);
        lv[y].push_back(i);
        v[i].nod1=x;
        v[i].nod2=y;

    }
}
int verif_grad( )
{
    for(int i=1;i<=n;i++)
        if(grad[i]%2!=0)
          return 0;
    return 1;
}
void rez( )
{
    s.push(1);
    while(!s.empty( ))
    {
        int nod=s.top();

        if(lv[nod].size())
        {
            int i=lv[nod].back();
            lv[nod].pop_back();
              if(v[i].used==1)
                {
                     if(v[i].nod1 != nod)
                    s.push(v[i].nod1);
                else
                    s.push(v[i].nod2);
                    v[i].used=0;


                }



        }
        else
        {
            c.push_back(nod);
            s.pop();
        }
    }

}
int main()
{
   citire( );
   FILE *f1=fopen("ciclueuler.out","w");
   if(verif_grad()==0)
      fprintf(f1,"-1");
   else
      {rez( );

       vector <int> :: iterator ii;
        c.pop_back();

        for(ii=c.begin();ii!=c.end();ii++)
            fprintf(f1,"%d ",*ii);
      }


    return 0;

}