Cod sursa(job #1143079)

Utilizator Vladinho97Iordan Vlad Vladinho97 Data 14 martie 2014 18:14:22
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <cstdio>
#include <vector>
#include <queue>
#include <stack>
#define nmax 100009
using namespace std;
struct vecini
{
    vector<int> v;
};
vecini g[nmax];
queue<int> q;
stack<int> st;vector<int> ans;
int deg[nmax];
bool viz[nmax];
int main()
{
    freopen("ciclueuler.in","r",stdin);
    freopen("ciclueuler.out","w",stdout);
    int i,j,n,m,x,y;
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;i++)
    {
        scanf("%d%d",&x,&y);
        g[x].v.push_back(y);deg[x]++;
        g[y].v.push_back(x); deg[y]++;
    }
    q.push(1);
    viz[1]=true;
    while(q.empty()==0)
    {
        int top=q.front();
        int lung=g[top].v.size();
        for(i=0;i<lung;++i)
        {
            if(viz[g[top].v[i]]==false)
            {
                viz[g[top].v[i]]=true;
                q.push(g[top].v[i]);
            }
        }
        q.pop();
    }
    for(i=1;i<=n;i++)
    {
        if(viz[i]==false||deg[i]%2!=0)
        {
            printf("-1\n");
            return 0;
        }
    }
    st.push(1);
    while(st.empty()==0)
    {
        x=st.top();
        if(deg[x]>0)
        {
            deg[x]--;
            int urm=g[x].v[0],lung;
            deg[urm]--;
            g[x].v.erase(g[x].v.begin());
            lung=g[urm].v.size();
            for(i=0;i<lung;++i)
                if(g[urm].v[i]==x)
                {
                    g[urm].v.erase(g[urm].v.begin()+i);
                    break;
                }
            st.push(urm);
            continue;
        }
        ans.push_back(x);
        st.pop();
    }
    int lung=ans.size()-2;
    for(i=0;i<=lung;++i)
        printf("%d ",ans[i]);
}