Cod sursa(job #2077488)

Utilizator mateibanuBanu Matei Costin mateibanu Data 28 noiembrie 2017 09:34:09
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <bits/stdc++.h>

using namespace std;

#define MAX 100010
#define f first
#define s second
#define mp make_pair

FILE*h=fopen("ciclueuler.in","r");
FILE*g=fopen("ciclueuler.out","w");

list<int>l[MAX];
list<int>::iterator lit;
list< pair<int,int> >r;
list< pair<int,int> >a;
list< pair<int,int> >::iterator it;

int main(){

    int n,m,x,y,i,j,nr,p;
    fscanf(h,"%d%d",&n,&m);
    for (i=1;i<=m;i++){
        fscanf(h,"%d%d",&x,&y);
        l[x].push_back(y);
        l[y].push_back(x);
    }
    x=1;i=1;
    while (m){
        j=l[i].back();
        l[i].pop_back();
        if (!l[i].empty()) p=i;
        for (lit=l[j].begin();lit!=l[j].end();lit++)
            if (*lit==i) {l[j].erase(lit);break;}
        m--;
        r.push_back(mp(i,j));
        i=j;
        if (i==x) break;

    }
    while (m){
        nr=r.size();
        x=p;
        while (true){
            j=l[i].back();
            l[i].pop_back();
            if (!l[i].empty()) p=i;
            for (lit=l[j].begin();lit!=l[j].end();lit++)
            if (*lit==i) {l[j].erase(lit);break;}

            m--;
            a.push_back(mp(i,j));
            i=j;
            if (x==i) break;
        }
        for (it=r.begin();it!=r.end();it++)
            if ((*it).first==x) break;
        while (!a.empty()) {
            r.insert(it,a.back());
            a.pop_back();
            it--;
        }
    }

    while (!r.empty()){
        fprintf(g,"%d ",r.back().f);
        r.pop_back();
    }

    fclose(h);
    fclose(g);
    return 0;
}