Cod sursa(job #1553666)

Utilizator superstar1998Moldoveanu Vlad superstar1998 Data 20 decembrie 2015 12:07:45
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 kb
#include <iostream>
#include <fstream>
#include <list>
#include <stack>
#include <queue>

#define N_MAX 100001
#define pb push_back
#define forit(C,it) for( typeof(C.begin()) it = C.begin(); it != C.end(); it++ )
#define fori(i,k,n) for(int i=k;i<=n;i++)

using namespace std;

list<int> G[N_MAX],L;
stack<int> S;
queue<int> Q;
int N,M,deg[N_MAX];
bool use[N_MAX];

void cit()
{
    ifstream f("ciclueuler.in");
    f>>N>>M;
    int x,y;
    fori(i,1,M)
    {
        f>>x>>y;
        G[x].pb(y),deg[x]++;
        G[y].pb(x),deg[y]++;
    }
    f.close();
}

void BFS(int v)
{
    Q.push(v),use[v]=true;
    while(!Q.empty())
    {
        v=Q.front();Q.pop();
        forit(G[v],it)
            if(!use[*it])
                Q.push(*it),use[*it]=true;
    }
}

bool este_conex()
{
    BFS(1);
    fori(i,2,N) if(!use[i]) return false;
    return true;
}

bool eulerian()
{
    if(!este_conex()) return false;
    fori(i,1,N) if(deg[i]%2)return false;
    return true;
}

void sterge(int i, int j)
{
    G[i].pop_front();
    forit(G[j],it)
        if(*it==i)
        {
            G[j].erase(it);
            break;
        }
}

void euler(int v)
{
    int w;
    while (true)
    {
        if(G[v].empty()) break;
        w=G[v].front();
        S.push(v);
        sterge(v,w);
        v=w;
    }
}

bool rez()
{
    if(!eulerian())
        return false;
    int v=1;
    do
    {
        euler(v);
        v=S.top();S.pop();
        L.pb(v);
    } while(!S.empty());
    return true;
}

void scrie(bool ok)
{
    ofstream g("ciclueuler.out");
    if(!ok)
    {
        g<<-1;
        g.close();
        return;
    }
    forit(L,it)
        g<<*it<<" ";
    g.close();
}

int main()
{
    cit();
    scrie(rez());
    return 0;
}