Cod sursa(job #1378352)

Utilizator httpsLup Vasile https Data 6 martie 2015 11:46:03
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <fstream>
#include <iostream>
#include <stack>
#include <vector>
using namespace std;

ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");

#define foor(it,v) for(__typeof(v.begin()) it=v.begin();it!=v.end();++it)
#define cout g
int n,m,i;
struct eee
    {
    int a,b;
    };
vector<eee> muc;
vector<vector<int> >G;
vector<bool> on;
vector<int> grad;
stack<int> stiva;
int gi();
void euler(int nod)
    {

    stiva.push(nod);

    while (!stiva.empty())
        {
        inc:;
        nod=stiva.top();
        foor(it,G[nod]) if(on[*it])
            {
            on[*it]=false;
            stiva.push(muc[*it].a==nod ? muc[*it].b:muc[*it].a);
            goto inc;
            }
        stiva.pop();
        cout<<nod<<' ';
        }
    }

    int main()
        {
        n=gi();
        m=gi();
        muc.resize(m+1);
        G.resize(n+1);
        on.resize(m+1,true);
        grad.resize(n+1);
        for(i=1; i<=m; ++i)
            {
            muc[i].a=gi();
            muc[i].b=gi();
            ++grad[muc[i].a];
            ++grad[muc[i].b];
            G[muc[i].a].push_back(i);
            G[muc[i].b].push_back(i);
            }
        for(i=1; i<=n; ++i) if(grad[i]&1)
                {
                cout<<"-1";
                return 0;
                }
        euler(1);
        return 0;
        }

#define maxb 2
int pos(maxb);
char buf[maxb];
int gi()
{
    int nr=0;
    while(buf[pos]<'0' || buf[pos]>'9') if(++pos>=maxb) f.read(buf,maxb),pos=0;
    while(buf[pos]>='0' && buf[pos]<='9')
    {
        nr=nr*10+buf[pos]-'0';
        if(++pos>=maxb) f.read(buf,maxb),pos=0;
    }
    return nr;
}