Cod sursa(job #1508823)

Utilizator cristibogdanPatrascu Cristian cristibogdan Data 23 octombrie 2015 00:16:05
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.22 kb
#include <fstream>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
vector <int> G[100001];
stack <int> stiva;
int i,j,n,m,x,y,vf,N,L[100001],Rez[500001],ok;
bool viz[500001];
void dfs(int nod){
    viz[nod]=1;
    for(int j=0;j<G[nod].size();j++)
        if(viz[G[nod][j]]==0)
            dfs(G[nod][j]);
}
void euler(int k){
    }
int main()
{f>>n>>m;
for(i=1;i<=m;i++){
    f>>x>>y;
    G[x].push_back(y);
    G[y].push_back(x);
}
for(i=1;i<=n;i++){

    L[i]=G[i].size();
    if(L[i]&1){
        g<<-1;
        ok=1;
    }}
for(i=1;i<=n;i++)
    if(L[i]>0)
    {
        vf=i;
        dfs(i);
        break;
    }
for(i=1;i<=n;i++)
       if(viz[i]==0&&L[i]>0){
          g<<-1;
         ok=1;
       }
stiva.push(vf);
while(stiva.empty()!=1){
    vf=stiva.top();
    L[vf]=G[vf].size();
    if(L[vf]>0)
{
        int nou=G[vf].back();
        stiva.push(nou);
        G[nou].erase(find(G[nou].begin(), G[nou].end(), vf));
        G[vf].pop_back();
}
    else
        {
        Rez[++N]=vf;
        stiva.pop();
        }

}
if(ok==0)
for(i=1;i<N;i++)
  g<<Rez[i]<<" ";
    return 0;
}