Cod sursa(job #1589836)

Utilizator gapdanPopescu George gapdan Data 4 februarie 2016 15:01:31
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <cstdio>
#include <vector>
#include <stack>
#include <cstring>
#define NMAX 100005

using namespace std;

struct punct
{
    int x,y;
};
vector<punct>v[NMAX];
stack<int>st;
int n,m,i,x,y,cmp,ok;
int grd[NMAX],viz[5*NMAX];
punct per(int a,int b)
{
    punct X;
    X.x=a;X.y=b;
    return X;
}
void DFS(int nod)
{
    int i;
    viz[nod]=1;
    for(i=0;i<v[nod].size();++i)
    {
        int fiu=v[nod][i].x;
        if(viz[fiu] == 0) DFS(fiu);
    }
}

int main()
{
    freopen("ciclueuler.in","r",stdin);
    freopen("ciclueuler.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(i=1;i<=m;++i)
    {
        scanf("%d%d",&x,&y);
        v[x].push_back(per(y,i));
        v[y].push_back(per(x,i));
        ++grd[x];
        ++grd[y];
    }
 DFS(1);
 ok=0;
    for(i=1; i<=n; ++i)
    {
        if((viz[i] == 0 && grd[i]>0) || (grd[i] % 2 == 1))
        {
            printf("-1\n");
            return 0;
        }
    }

    memset(viz,0,sizeof(viz));
        ok=1;
        st.push(n);
        while(!st.empty())
        {
            int x=st.top();
            if(grd[x] == 0)
            {
                if(!ok) printf("%d ",x);
                ok=0;
                st.pop();
                continue;
            }
            while(viz[v[x][v[x].size()-1].y] == 1) v[x].erase(v[x].end()-1);
            viz[v[x][v[x].size()-1].y]=1;
            st.push(v[x][v[x].size()-1].x);
            --grd[x];
            --grd[v[x][v[x].size()-1].x];
            v[x].erase(v[x].end()-1);
        }
    return 0;
}