Cod sursa(job #1678707)

Utilizator MaraaMMihali Mara MaraaM Data 7 aprilie 2016 15:05:20
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include <fstream>
#include <list>
#include <stack>
#include <queue>
#include <algorithm>
using namespace std;
ifstream f("euler.in");
ofstream g("euler.out");
#define N 100005
list<int> G[N],L;
stack<int> S;
queue<int>  Q;
int n,m,i,a,b, deg[N],viz[N];
void BFS(int v)
{
    Q.push(v); viz[v]=1;
    while(!Q.empty())

        {
            v=Q.front(); Q.pop();
            for(list<int>::const_iterator it=G[v].begin();it!=G[v].end();++it)
                 if(viz[*it]==0)
            {
                Q.push(*it); viz[*it]=1;
            }

        }


}
int conex()
{
    BFS(1);
    for(i=1;i<=n;i++)
        if(viz[i]==0)
          return 0;
    return 1;

}
int eulerian()
{
    if(!conex()) return 0;
     for(i=1;i<=n;i++)
             if(deg[i]%2) return 0;
    return 1;
}
void sterge(int x, int y)
{
    deg[x]--; deg[y]--;
    G[x].pop_front();
    for(list<int>::const_iterator it=G[y].begin();it!=G[y].end();++it)
        if(*it==x)
    {
        G[y].erase(find(G[y].begin(),G[y].end(),x)); break;
    }

}
void euler(int x)
{
    while(true)
    {
        if(G[x].empty())
            break;
        int y=G[x].front();
        S.push(x);
        sterge(x,y);
        x=y;
    }
}
int rezolvat()
{
    int v=eulerian();
    if(!v) return -1;
    do{euler(v);
        v=S.top(); S.pop();
        L.push_back(v);



             }while(!S.empty());
  return 1;
}
void write(int x)
{
    if(x==-1)
        g<<-1;

    else {
            for(list<int>::const_iterator v=L.begin();v!=L.end();++v)
        g<<*v<<' ';}
}
int main()
{  int x,y;
    f>>n>>m;
    for(i=1;i<=m;i++)
    {
        f>>x>>y;
        G[x].push_back(y);
        G[y].push_back(x);
    }
    write(rezolvat());
    return 0;
}