Cod sursa(job #2095891)

Utilizator georgerapeanuRapeanu George georgerapeanu Data 28 decembrie 2017 13:04:11
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <cstdio>
#include <set>
#include <vector>
#include <algorithm>
using namespace std;
FILE *f = fopen("ciclueuler.in","r");
FILE *g = fopen("ciclueuler.out","w");
int N,M;
vector<pair<int,int> >  G[100005];
bool U[500005];
int st[500005];
int len;
int gr[100005];
int nr;
int main()
{
    fscanf(f,"%d %d",&N,&M);
    for(int i = 1;i <= M;i++){
        int x,y;
        fscanf(f,"%d %d",&x,&y);
        G[x].push_back({y,i});
        G[y].push_back({x,i});
        gr[x]++;
        gr[y]++;
    }
    for(int i = 1;i <= N;i++){
        nr += (gr[i] % 2 == 1);
    }
    if(nr){
        fprintf(g,"-1");
        return 0;
    }
    st[++len] = 1;
    while(len){
        int nod = st[len];
        while(!G[nod].empty() && U[G[nod].back().second]){
            G[nod].pop_back();
        }
        if(!G[nod].empty()){
            int v = G[nod].back().first;
            U[G[nod].back().second] = 1;
            G[nod].pop_back();
            st[++len] = v;
            fprintf(g,"%d ",v);
        }
        else{
            len--;
        }
    }
    fclose(f);
    fclose(g);
    return 0;
}