Cod sursa(job #1214787)

Utilizator acomAndrei Comaneci acom Data 31 iulie 2014 13:12:58
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include<fstream>
#include<stack>
#include<vector>
#include<bitset>
using namespace std;
#define NMAX 100005
#define MMAX 500005
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
vector < pair <int,int> > L[NMAX];
vector < pair <int,int> >::reverse_iterator it;
bitset <MMAX> viz;
bitset <NMAX> v;
stack <int> S;
int n,m,x,y,z,start,first,D[NMAX];
void dfs(int s)
{
    v[s]=1;
    for (int i=0;i<L[s].size();++i)
        if (!v[L[s][i].first])
            dfs(L[s][i].first);
}
int main()
{
    int i;
    fin>>n>>m;
    for (i=1;i<=m;++i)
    {
        fin>>x>>y;
        L[x].push_back(make_pair(y,i));
        L[y].push_back(make_pair(x,i));
        ++D[x], ++D[y];
    }
    for (i=1;i<=n;++i)
        if (D[i])
        {
            dfs(i);
            start=i;
            break;
        }
    for (i=1;i<=n;++i)
        if ((D[i] && !v[i]) || D[i]%2)
        {
            fout<<"-1\n";
            return 0;
        }
    first=1;
    S.push(start);
    while (!S.empty())
    {
        x=S.top();

        while (!L[x].empty()) {
            it = L[x].rbegin();
            y=it->first, z=it->second;
            if (viz[z])
            {
                L[x].erase(L[x].end()-1);
            }
            else
                break;
        }

        if (L[x].empty()) {
            if (!first)
                fout<<x<<" ";
            first=0;
            S.pop();
            continue;
        }
        viz[z] = 1;
        S.push(y);

    }
    return 0;
}