Cod sursa(job #1482701)

Utilizator MaligMamaliga cu smantana Malig Data 7 septembrie 2015 19:02:03
Problema Ciclu Eulerian Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 2.71 kb
#include<iostream>
#include<fstream>
#include<cmath>
#include<algorithm>
#include<vector>
#include<bitset>
#include<cstring>
#include<queue>
#include<stack>

#define ull unsigned long long
#define ll long long
#define pb push_back
#define FOR(a,b,c) for (int a=b;a<=c; ++a)
#define ROF(a,b,c) for (int a=b;a>=c; --a)

using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
int N,M,nrimp,nod,nrnod;
int deg[100010];
stack<int> s;
stack<int> rez;

struct elem {
    int val;
    elem* next=NULL;
};
elem *lista[100010];

void add(elem*,int);
void del(elem*,int);
bool empt(elem*);
void euler();

int main()
{
    f>>N>>M;
    FOR (i,1,N) {
        elem *p=new elem;
        p->next=lista[i];
        lista[i]=p;
        elem *p2=new elem;
        lista[i]->next=p2;
    }
    FOR (i,1,M) {
        int x,y;
        f>>x>>y;
        add(lista[x],y);
        add(lista[y],x);
        ++deg[x];
        ++deg[y];
    }
    /*
    del(lista[2],2);
    del(lista[2],2);
    lista[2]=lista[2]->next;
    while (lista[2]->next!=NULL) {
        cout<<lista[2]->val<<' ';
        lista[2]=lista[2]->next;
    }
    cout<<'\n'<<empt(lista[3]);
    */
    FOR (i,1,N) {
        if (deg[i]%2==1) {
            ++nrimp;
            nod=i;
        }
    }
    if (nrimp==0 || nrimp==2) {
        if (!nrimp) {
            s.push(1);
        }
        else {
            s.push(nod);
        }
        //cout<<"WTF";
        euler();
        if (nrnod<=N) {
            g<<(-1);
        }
        else {
            while (!rez.empty()) {
                g<<rez.top()<<' ';
                rez.pop();
            }
        }
        //cout<<"WTF";
    }
    else {
        g<<(-1);
    }
    f.close();g.close();
    return 0;
}

void add(elem* lista,int val) {
    elem* p=lista;
    while (lista->next!=NULL) {
        p=lista;
        lista=lista->next;
    }
    elem* da=new elem;
    da->val=val;
    da->next=lista;
    p->next=da;
}

void del(elem* lista,int val) {
    elem* p=lista;
    lista=lista->next;
    while (lista->val!=val) {
        p=lista;
        lista=lista->next;
    }
    p->next=lista->next;
    delete lista;
}

bool empt(elem* li) {
    if ((li->next)->next==NULL) {
        return true;
    }
    return false;
}

void euler() {
    while (!s.empty()) {
        int nod=s.top();
        ++nrnod;
        if (!empt(lista[nod])) {
            int fiu=(lista[nod]->next)->val;
            s.push(fiu);
            del(lista[nod],fiu);
            del(lista[fiu],nod);
        }
        else {
            rez.push(nod);
            //g<<nod<<' ';
            s.pop();
        }
    }
}