Cod sursa(job #1911833)

Utilizator ZeBuGgErCasapu Andreas ZeBuGgEr Data 7 martie 2017 21:56:07
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include<cstdio>
#include<vector>

using namespace std;

int n,m;
vector< pair<int,int> > adj[100010];
vector<int> res;
int grad[100010];
int output[500010],pos;
bool used[500010];

void solve(int nod)
{
    //used[adj[nod].back().second()]=1;
    res.push_back(nod);
    int next=nod;
    int temp;
    bool flag;
    while(!res.empty())
    {
        while(!adj[next].empty())
        {
            flag=0;
            if(used[adj[next].back().second]==0)
            {
                flag=1;
                used[adj[next].back().second]=1;
                res.push_back(adj[next].back().first);
                temp=adj[next].back().first;
            }
            adj[next].pop_back();
            if(flag==1)
            {
                next=temp;
            }
        }
        pos++;
        output[pos]=res.back();
        next=res.back();
        res.pop_back();
    }
}

int main()
{
    freopen("ciclueuler.in","r",stdin);
    freopen("ciclueuler.out","w",stdout);

    scanf("%d %d",&n,&m);

    int x,y;
    for(int i=1;i<=m;i++)
    {
        scanf("%d %d",&x,&y);
        adj[x].push_back(make_pair(y,i));
        adj[y].push_back(make_pair(x,i));
        grad[x]++;
        grad[y]++;
    }
    bool flag=1;
    for(int i=1;i<=n;i++)
    {
        if(grad[i]==0||grad[i]&1==1)
        {
            flag=0;
            break;
        }
    }
    if(flag==0)
    {
        printf("-1\n");
    }
    else
    {
        solve(1);
        for(int i=1;i<pos;i++)
        {
            printf("%d ",output[i]);
        }
    }
}