Cod sursa(job #1651548)

Utilizator theodor1289Theodor Amariucai theodor1289 Data 13 martie 2016 15:28:45
Problema Ciclu Eulerian Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 2.01 kb
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
vector< pair<int, int> > g[100010];
int n, m, incep, x, y;
int stiva[500010], k;
int eulerian[100010], izolate;
int muchiiramase;
int bucle[100010];

void dfs(int nod)
{
    int vecin;
    while(bucle[nod])
    {
        stiva[++k]=nod;
        bucle[nod]--;
    }

    while(g[nod].size())
    {
        vecin=g[nod][0].first;

        stiva[++k]=vecin;

        if(g[nod][0].second==1)
        {
            g[nod].erase(g[nod].begin());
        }
        else
            g[nod][0].second--;


        vector< pair<int, int> > ::iterator j=g[vecin].begin();
        for(; (*j).first!=nod; j++);

        if((*j).second==1)
        {
            vecin[g].erase(j);
        }
        else
            (*j).second--;

        dfs(vecin);
    }




}

int main()
{
    fin>>n>>m;

    for(int i=1;i<=m;i++)
    {
        fin>>x>>y;
        incep=x;
        if(x!=y)
        {
        eulerian[x]++;
        eulerian[y]++;
        int i, j;

        for(i=0;i<g[x].size();i++)
            if(g[x][i].first==y)
            {
                g[x][i].second++;
                break;
            }

        for(j=0;j<g[y].size();j++)
            if(g[y][j].first==x)
            {
                g[y][j].second++;
                break;
            }

        if(i==g[x].size())
            g[x].push_back(make_pair(y, 1));
        if(j==g[y].size())
            g[y].push_back(make_pair(x, 1));
        }
        else
            bucle[x]++;
    }

    for(int i=1;i<=n;i++)
    if(!eulerian[i])
            izolate++;
        else
    if(!(eulerian[i]%2==0))
    //gradul nu e par
    {
        fout<<-1;
        return 0;
    }

    dfs(incep);

    if(muchiiramase)
        //nu e conex
    {
        fout<<-1;
        return 0;
    }
    else
        for(int i=1;i<=k;i++)
        fout<<stiva[i]<<' ';

    return 0;
}