Cod sursa(job #1937714)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 24 martie 2017 10:17:56
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.12 kb
#include <bits/stdc++.h>
#define MAXN 100000
#define MAXM 500000
std::vector < std::pair <int,int> > G[MAXN+1];
bool viz[MAXM+1];
int stiv[MAXM+1];
int sol[MAXM+1];
int main(){
    FILE*fi,*fout;
    int i,n,m,nod,a,b,ist,sz;
    fi=fopen("ciclueuler.in" ,"r");
    fout=fopen("ciclueuler.out" ,"w");
    fscanf(fi,"%d %d " ,&n,&m);
    for(i=1;i<=m;i++){
       fscanf(fi,"%d %d " ,&a,&b);
       G[a].push_back(std::make_pair(b,i));
       G[b].push_back(std::make_pair(a,i));
    }
    i=1;
    while(i<=n&&G[i].size()%2==0)
      i++;
    if(i<=n)
      fprintf(fout,"-1");
    else{
      ist=0;
      stiv[ist]=1;
      sz=m;
      while(ist>=0){
         int nod=stiv[ist];
         while(G[nod].size()&&viz[G[nod].back().second])
            G[nod].pop_back();
         if(G[nod].size()==0){
            ist--;
            sol[sz--]=nod;
         }
         else{
            stiv[ist+1]=G[nod].back().first;
            viz[G[nod].back().second]=1;
            G[nod].pop_back();
            ist++;
         }
      }
      for(i=0;i<=m;i++)
        fprintf(fout,"%d " ,sol[i]);
    }
    fclose(fi);
    fclose(fout);
    return 0;
}