Cod sursa(job #2290449)

Utilizator lucaperjuLuca Perju Verzotti lucaperju Data 26 noiembrie 2018 15:32:00
Problema Ciclu Eulerian Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.18 kb
#include <iostream>
#include <vector>
#include <cstdio>
using namespace std;
bool viz[100003],ok[500003];
/*loange loange*/ long long rez[500003],a[500003],b[500003],n,m,k;
vector </*loange loange*/ long long> v[100003];

const /*loange loange*/ long long dim=1<<17;

char getch()

{

    static char buff[dim];

    static /*loange loange*/ long long bp=dim;

    if(bp==dim)

    {

        bp=0;

        fread(buff,1,dim,stdin);

    }

    return buff[bp++];

}

void get(/*loange loange*/ long long &a)

{

    a=0;

    char ch;

    do

    {

        ch=getch();

    }

    while(ch<'0'||ch>'9');

    do

    {

        a=a*10+ch-'0';

        ch=getch();

    }

    while('0'<=ch&&ch<='9');

}
void citire()
{
    get(n);
    get(m);
    /*loange loange*/ long long i;
    for(i=1;i<=m;++i)
    {
        //cin>>a[i]>>b[i];
        get(a[i]);
        get(b[i]);
    //    ++ok[a*(n+1)+b];
    //    ++ok[b*(n+1)+a];
        v[a[i]].push_back(i);
        v[b[i]].push_back(i);
    }
}
void dfs (/*loange loange*/ long long poz)
{
    viz[poz]=1;
    for(/*loange loange*/ long long i=0;i<v[poz].size();++i)
    {
        /*loange loange*/ long long nn=v[poz][i];
        if(a[nn]==poz)
            nn=b[nn];
        else
            nn=a[nn];
        if(!viz[nn])
            dfs(nn);
    }
}
bool verif ()
{
    /*loange loange*/ long long i,cnt=0;
    for(i=1;i<=n;++i)
        if(v[i].size()%2)
            return false;
  /*  for(i=1;i<=n;++i)
    {
        if(!viz[i])
        {
            dfs(i);
            ++cnt;
        }
    }
    if(cnt!=1)
        return false;*/
    return true;
}
void euler (/*loange loange*/ long long poz)
{
    for(/*loange loange*/ long long i=0;i<v[poz].size();++i)
    {
        /*loange loange*/ long long nn=v[poz][i];
        if(ok[nn])
            continue;
        if(a[nn]==poz)
            nn=b[nn];
        else
            nn=a[nn];
        ok[v[poz][i]]=1;
        euler(nn);
    }
    rez[++k]=poz;
}
int main()
{

    freopen("ciclueuler.in","r",stdin);
    freopen("ciclueuler.out","w",stdout);
    citire();
    if(verif()==0)
        cout<<-1;
    else
        euler(1);
    for(/*loange loange*/ long long i=1;i<k;++i)
        cout<<rez[i]<<' ';
    return 0;
}