Cod sursa(job #1240520)

Utilizator gapdanPopescu George gapdan Data 11 octombrie 2014 15:16:08
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include<cstdio>
#include<stack>
#include<vector>
#define NMAX 100001
#define MMAX 500001
using namespace std;
typedef pair<int,int>pp;
vector<pp>v[NMAX];
stack<int>st;
int viz[MMAX],muc[NMAX];
int n,i,x,y,m;
void DFS(int nod)
{
    viz[nod]=1;
    for(int i=0;i<v[nod].size();++i)
    {
        if (viz[v[nod][i].first]==0)
            DFS(v[nod][i].first);
    }
}
int main()
{
    freopen("ciclueuler.in","r",stdin);
    freopen("ciclueuler.out","w",stdout);
    scanf("%d%d",&n,&m);
    for (int i=1;i<=m;++i)
    {
        scanf("%d%d",&x,&y);
        v[x].push_back(pp(y,i));
        v[y].push_back(pp(x,i));
        muc[x]++;
        muc[y]++;
    }
    int s=0;
    for (int i=1;i<=n;++i)
    {
        if (viz[i]==0)
        {
            DFS(i);
            s=i;
        }
    }
    for (i=1;i<=n;++i)
    {
        if ((viz[i]==0 && muc[i]>0) || (muc[i]%2==1))
        {
            printf("-1\n");
            return 0;
        }
    }
    for (i=1;i<=n;++i) viz[i]=0;
    int valid=1;
    st.push(n);
    while(!st.empty())
    {
        x=st.top();
        if (muc[x]==0)
        {
            if (!valid) printf("%d ",x);
            valid=0;
            st.pop();
            continue;
        }
        while(viz[v[x][v[x].size()-1].second]==1)
            v[x].erase(v[x].end()-1);
        viz[v[x][v[x].size()-1].second]=1;
        st.push(v[x][v[x].size()-1].first);
        --muc[x];
        --muc[v[x][v[x].size()-1].first];
        v[x].erase(v[x].end()-1);
    }
    return 0;
}