Cod sursa(job #432386)

Utilizator wefgefAndrei Grigorean wefgef Data 2 aprilie 2010 12:18:37
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.18 kb
#include<stdio.h>
#include<vector>
using namespace std;
int n,m,x[500002],y[500002],sol[500002];
bool viz[500002];
vector<int> v[100002];
vector< vector<int>::iterator > it;

void read()
{
    freopen("ciclueuler.in","r",stdin);
    freopen("ciclueuler.out","w",stdout);
    scanf("%d%d\n",&n,&m);
    int i,j;
    char s[20];
    for(i=1;i<=m;i++)
    {
        gets(s);
        for(j=0;s[j]!=' ';j++)
            x[i]=(x[i]<<3)+(x[i]<<1)+s[j]-'0';
        for(++j;s[j];j++)
            y[i]=(y[i]<<3)+(y[i]<<1)+s[j]-'0';
        v[x[i]].push_back(i);
        v[y[i]].push_back(i);
    }
    it.push_back(v[0].begin());
    for(i = 1; i <= n; i++)
      it.push_back(v[i].begin());
}

inline void dfs(const int &nod)
{
    while (it[nod] != v[nod].end()) 
        if(!viz[*(it[nod])])
        {
            int i=*(it[nod]);
            viz[i]=1;
            it[nod]++;
            dfs(x[i]+y[i]-nod);
        } else {
          ++it[nod];
        }
    sol[++sol[0]]=nod;
}

int main()
{
    read();
    for(int i=1;i<=n;i++)
        if(v[i].size()&1)
        {
            printf("-1\n");
            return 0;
        }
    dfs(1);
    while(sol[0]>1)
        printf("%d ",sol[sol[0]--]);
    return 0;
}