Cod sursa(job #1509653)

Utilizator KOzarmOvidiu Badea KOzarm Data 24 octombrie 2015 10:34:15
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <fstream>
#include <vector>
#include<iostream>
#include<algorithm>
using namespace std;
vector <int> G[100001];
int gr[100001],st[500001],vs,viz[500003],N,vf;

ifstream fin("ciclueuler.in");
ofstream g("ciclueuler.out");
int n,m,i,j,x,y;
void df(int nod)
{
    viz[nod]=1;
    for(int i=0;i<G[nod].size();++i)
        if(viz[G[nod][i]]==0)
           df(G[nod][i]);
}
void euler(int nod)
{
    ++vs;
    st[vs]=nod;
    while(vs>0){
    int k=st[vs];
    if(G[k].size()!=0){

               st[++vs]=G[k].back();
               G[k].pop_back();
               G[st[vs]].erase(find(G[st[vs]].begin(),G[st[vs]].end(),k));

      }
    else
    {
        viz[++N]=k;
        vs--;

    }



}


}

int main()
{
    fin>>n>>m;
    for(i=1;i<=m;i++)
    {
        fin>>x>>y;
        G[x].push_back(y);
        G[y].push_back(x);
        gr[x]++;gr[y]++;
    }
 for(i=1;i<=n;i++)
     if(gr[i]==1)
 {
     g<<-1;
     return 0;

 }
 for(i=1;i<=n;i++)
      if(gr[i])
 {
          vf=i;
            df(i);
            break;
 }
 for(i=1;i<=n;i++)
       if(gr[i]!=0&&viz[i]==0)
 {
     g<<-1;
     return 0;

 }

 euler(vf);
 for(i=1;i<N;i++)
     g<<viz[i]<<" ";

    return 0;
}