Cod sursa(job #2054929)

Utilizator vladboss2323Ciorica Vlad vladboss2323 Data 2 noiembrie 2017 18:01:05
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.69 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

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

const int N=100001;
const int M=500001;
vector<int>a[N];
bool viz[M];
int n,m,m1[M],m2[M],q[M+1],k=0;

void citire()
{
    int i;
    in>>n>>m;
    for(i=1; i<=m; i++)
    {
        in>>m1[i]>>m2[i];
        a[m1[i]].push_back(i);
        a[m2[i]].push_back(i);
    }
}
/*
1 0 1 0 0 0
1 1 2 2 3 3
2 3 2 3 4 4

1 1 2
2 1 3 4
3 2 4 5 6
4 5 6
*/

inline int celalalt(int indice, int nod)
{
    if (m1[indice] == nod)
    {
        return m2[indice];
    }
    return m1[indice];
}

void dfs(int nod)
{
    int i,indice;
    for(i=0; i<a[nod].size(); i++)
    {
        indice=a[nod][i];
        if(viz[indice]==0)
        {
            //q[++k]=m1[indice];
            //q[++k]=m2[indice];
            viz[indice]=1;
            dfs(celalalt(indice, nod));
        }
    }
    q[++k] = nod;
}
//dfs 1
//dfs 2
//dfs 2
//dfs 3
//dfs 4
//dfs 3

int main()
{
    int ok=1,i;
    citire();
    /*
    for(i=1;i<=n;i++)
    {
        out<<i<<" ";
        for(j=0;j<a[i].size();j++)
            out<<a[i][j]<<" ";
        out<<endl;
    }
    */
    for(i=1; i<=n; i++)
        if(ok==1)
        {
            if((a[i].size())%2==1)
                ok=0;
        }
    if(ok==0)
        out<<-1;
    else
    {
        for(i=1; i<=n; i++)
            if(a[i].size()!=0 && ok==1)
            {
                dfs(i);
                ok=0;
            }
        if(k==m+1)
            for(i=1; i<=k; i++)
                out<<q[i]<<" ";
        else
            out<<-1;

    }
    return 0;
}