Cod sursa(job #2664915)

Utilizator Mihai_EduardMihai Eduard Mihai_Eduard Data 29 octombrie 2020 18:38:24
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.23 kb
#include <iostream>
#include <queue>
#include <stack>
#include <fstream>

using namespace std;

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

struct nod
{
    int info;
    nod *urm;
}*l[100001];

int gr[100001], n, m;
stack <int> st;
queue <int> q;
bool fr[100001];

void adauga(int i, int j)
{
    nod *p=new nod;
    p->info=j;
    p->urm=l[i];
    l[i]=p;
}

void citire()
{
    fin>>n>>m;
    int x, y;
    for(int i=1;i<=m;i++)
    {
        fin>>x>>y;
        adauga(x,y);
        adauga(y,x);
        gr[x]++;
        gr[y]++;
    }
    fin.close();
}

void dfs(int poz)
{
    st.push(poz);
    int top;
    fr[poz]=1;
    while(!st.empty())
    {
        top=st.top();
        st.pop();
        for(nod *p=l[top];p!=NULL;p=p->urm)
        {
            if(fr[p->info]==0)
            {
                fr[p->info]=fr[top]+1;
                st.push(p->info);
            }
        }
    }
}

int verif_eulerian()
{
    for(int i=1;i<=n;i++)
        if(gr[i]%2==1)
            return 0;
    return 1;
}

int verif_conex()
{
    dfs(1);
    for(int i=1;i<=n;i++)
        if(fr[i]==0)
                return 0;
    return 1;
}

void sterge(int i,int j)
{
    if(l[i]->info==j)
    {
        nod *a=l[i];
        l[i]=l[i]->urm;
        delete a;
    }
    else
    {
        nod *a=l[i];
        nod *p=l[i]->urm;
        while(p!=NULL)
        {
            if(p->info==j)
            {
                a->urm=p->urm;
                delete p;
                break;
            }
            else
            {
                a=a->urm;
                p=p->urm;
            }
        }
    }
}

void euler(int x)
{
    while(l[x]!=NULL)
    {
        int y=l[x]->info;
        sterge(x,y);
        sterge(y,x);
        euler(y);
    }
    q.push(x);
}

void rezolvare()
{
    if(verif_conex()==1 and verif_eulerian()==1)
    {
        euler(1);
        while(!q.empty())
        {
            if(q.size()>1)
                fout<<q.front()<<' ';
            q.pop();
        }
    }
    else
    {
        fout<<-1<<'\n';
    }
    fout.close();
}
int main()
{
    citire();
    rezolvare();
    return 0;
}