Cod sursa(job #1483109)

Utilizator BogdanisarBurcea Bogdan Madalin Bogdanisar Data 8 septembrie 2015 18:26:46
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.15 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,nrbfs;
int deg[100010];
bitset<100010> verif;
vector<int> v[100010];
queue<int> Q;
stack<int> s;

void bfs();
void euler();
void sterge(int,int);

int main()
{
    f>>N>>M;
    FOR (i,1,M) {
        int x,y;
        f>>x>>y;
        v[x].pb(y);
        v[y].pb(x);
        ++deg[x];
        ++deg[y];
    }
    Q.push(1);
    verif.set(1,1);
    bfs(); // se verifica daca graful este conex
    if (nrbfs!=N) {
        g<<"-1";
        return 0;
    }
    FOR (i,1,N) { // se verifica cate noduri au gradul impar
        if (deg[i]%2==1) {
            ++nrimp;
            nod=i;
        }
    }
    if (nrimp==0) { // trebuia (nrimp==0 || nrimp==2) dar i don't know what the fuck
        if (!nrimp) {
            s.push(1);
        }
        else {
            s.push(nod);
        }
        euler();
    }
    else {
        g<<"-1";
    }
    f.close();g.close();
    return 0;
}

void bfs() {
    while (!Q.empty()) {
        int nod=Q.front();
        //cout<<nod<<'\n';
        ++nrbfs;
        Q.pop();
        for (unsigned int k=0;k<v[nod].size();++k) {
            if (!verif.test(v[nod][k])) {
                Q.push(v[nod][k]);
                verif.set(v[nod][k],1);
            }
        }
    }
}

void euler() {
    while (!s.empty()) {
        int nod=s.top();
        if (v[nod].size()) {
            int fiu=v[nod].back();
            s.push(fiu);
            v[nod].pop_back();
            sterge(fiu,nod);
        }
        else {
            g<<nod<<' ';
            s.pop();
        }
    }
}

void sterge(int nod,int val) {
    vector<int>::iterator it;
    it=v[nod].begin();
    while (*it!=val) {
        ++it;
    }
    v[nod].erase(it);
}