Cod sursa(job #1361121)

Utilizator AeroHHorea Stefan AeroH Data 25 februarie 2015 19:46:48
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include <vector>
#include <fstream>
#include <algorithm>
#include <stack>
#define x first
#define y second
using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");

vector<int> v[100001];
pair<int,int> mu[500001];
int i,j,n,m,it[100001],mark[500001],deg[100001],fv[100001],x,y;

int getnode(int muchie,int in)
    {
        return (mu[muchie].x+mu[muchie].y-in);
    }

void dfs(int nod)
{
    ++fv[nod];
    for(int i=0;i<v[nod].size();++i)
        {
            int newnode=getnode(v[nod][i],nod);
            if (!fv[newnode])
                dfs(newnode);
        }
}

void iseuler()
{
    for (int i=1;i<=n;++i)
        if ((deg[i]&1)||fv[i]==0)
            {
                g<<-1;
                exit(0);
            }
}

stack<int> S;
vector<int> rasp;

int main()
{
    f>>n>>m;
    for (i=1;i<=m;++i)
        {
            f>>x>>y;
            v[x].push_back(i);
            v[y].push_back(i);
            mu[i]=make_pair(x,y);
            deg[x]++,deg[y]++;
        }

    dfs(1);
    iseuler();
    S.push(1);
    int now;
    while(S.size())
        {
            int ok=0;
            now=S.top();
            for (;it[now]<v[now].size();++it[now])
                {
                    if (mark[v[now][it[now]]])continue;
                    mark[v[now][it[now]]]=1;
                    S.push(getnode(v[now][it[now]],now));
                    ++it[now];
                    ok=1;
                    break;
                }
            if (!ok)
                {
                    S.pop();
                    rasp.push_back(now);
                }
        }

    for(i=1;i<rasp.size();++i)
        g<<rasp[i]<<" ";


    return 0;
}