Cod sursa(job #2507158)

Utilizator Anca.ioanaMuscalagiu Anca Ioana Anca.ioana Data 9 decembrie 2019 18:35:30
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.59 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
vector < pair <int, int> > L[100001],M;
stack <int> S;
int Viz[500001],V[100001];
int n, m;
void Citire()
{ int i,u,v;
    f>>n>>m;
    for(i=0;i<=m-1;i++)
    { f>>u>>v;
        L[u].push_back(make_pair(v,i));
        L[v].push_back(make_pair(u,i));
        M.push_back(make_pair(u,v));
    }
}
void DFS(int nod)
{ V[nod]=1;
    int j;
    for(j=0;j<L[nod].size();j++)
    { int vec=L[nod][j].first;
        if(V[vec]==0)
            DFS(vec);
    }
}
int Verificare()
{int i,ok1=1,ok2=1;
 for(i=1;i<=n;i++)
    {if(V[i]==0)
        ok1=0;
     if(L[i].size()%2==1)
        ok2=0;}
     if(ok1==1&&ok2==1)
        return 1;
     else return 0;

}
vector <int> Sol;
void Ciclu_Eulerian()
{ int vecin;
S.push(1);
    while(!S.empty())
    { int nod=S.top();
        if(!L[nod].empty())
        { int poz=L[nod].back().second;
            L[nod].pop_back();
            if(Viz[poz]==0)
            { Viz[poz]=1;
                if(M[poz].first==nod)
                   vecin=M[poz].second;
                else vecin=M[poz].first;
                S.push(vecin);
            }
        }
        else { S.pop();
              Sol.push_back(nod);
             }
    }
}
void Afisare()
{ int i;
    for(i=0;i<Sol.size()-1;i++)
        g<<Sol[i]<<" ";
}
int main()
{
Citire();

DFS(1);

 if(Verificare()==0)
   g<<-1;
 else
   {Ciclu_Eulerian();
   Afisare();}
f.close();
g.close();
    return 0;
}