Cod sursa(job #728832)

Utilizator ioalexno1Alexandru Bunget ioalexno1 Data 29 martie 2012 00:10:16
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <stack>
#define N 100005
using namespace std;
vector <int> G[N];
vector <int>::iterator it;
queue <int> C;
stack <int> S;
bool viz[N];
int grad[N],n,k,sol[5*N];
void read()
{ int m,x,y;
freopen("ciclueuler.in","r",stdin); scanf("%d %d\n",&n,&m);
for(;m>=1;--m)
    {
    scanf("%d %d\n",&x,&y);
    ++grad[x]; ++grad[y];
    G[x].push_back(y);
    G[y].push_back(x);
    }
fclose(stdin);
}
int admite_ciclu()
{ int x,i;
viz[1]=1; C.push(1);
while(!C.empty())
    {
    x=C.front(); C.pop();
    for(it=G[x].begin();it!=G[x].end();++it)
        if(viz[*it]==0){ C.push(*it); viz[*it]=1; }
    }
for(i=1;i<=n;++i)
    if(viz[i]==0||grad[i]%2==1)return 0;
return 1;
}
void solve()
{ int v,w,i;
  bool e;
if(!admite_ciclu())printf("-1");
    else{
        v=1;
        do
        {
         while(!G[v].empty())
                {
                it=G[v].begin();
                w=*it;
                G[v].erase(it);
                e=false;
                for(it=G[w].begin();it!=G[w].end()&&!e;++it)
                    if(*it==v){ G[w].erase(it); e=true; }
                S.push(v);
                v=w;
                }
        v=S.top(); S.pop();
        sol[++k]=v;
        }
        while(!S.empty());
        }
for(i=k;i>=1;--i)
    printf("%d ",sol[i]);
}
int main()
{
k=0;
read();
freopen("ciclueuler.out","w",stdout);
solve();
fclose(stdout);
return 0;
}