Cod sursa(job #1358221)

Utilizator danalex97Dan H Alexandru danalex97 Data 24 februarie 2015 14:33:51
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <vector>
#include <algorithm>
#include <cstring>
#include <vector>
using namespace std;

ifstream F("ciclueuler.in");
ofstream G("ciclueuler.out");

const int N = 100010;
const int M = 500010;

int n,m,deg[N],mk[N],mke[M];
pair<int,int> edges[M];
vector<int> ans,v[N];
vector<int>::iterator it[N];

int _v(int x,int y)
{
    return edges[x].first + edges[x].second - y;
}

void dfs(int x)
{
    mk[x] = 1;
    for (int i=0;i<int(v[x].size());++i)
    {
        int y = _v(v[x][i],x);
        if ( mk[y] == 0 )
            dfs(y);
    }
}

int main()
{
    F>>n>>m;
    for (int i=1,x,y;i<=m;++i)
    {
        F>>x>>y;
        edges[i] = make_pair(x,y);
        v[x].push_back(i);
        v[y].push_back(i);
        deg[x]++;
        deg[y]++;
    }
    int ok = 1;
    dfs(1);
    for (int i=1;i<=n && ok;++i)
        if ( deg[i]%2 == 1 || mk[i] == 0 )
            ok = 0;
    if ( ok )
    {
        for (int i=1;i<=n;++i)
            it[i] = v[i].begin();

        vector<int> stk;
        stk.push_back( 1 );
        while ( !stk.empty() )
        {
            int x = stk.back();
            int ok = 1;
            for (;it[x] != v[x].end();++it[x])
            {
                if ( mke[*it[x]] ) continue;
                int y = _v(*it[x],x);
                stk.push_back( y );
                mke[*it[x]] = 1;
                ++it[x];
                ok = 0;
                break;
            }
            if ( ok && it[x] == v[x].end() )
            {
                ans.push_back( stk.back() );
                stk.pop_back();
            }
        }
        reverse(ans.begin(),ans.end());
        ans.pop_back();
        for (int i=0;i<ans.size();++i)
            G<<ans[i]<<' ';
        G<<'\n';
    }
    else
    {
        G<<"-1\n";
    }
}