Cod sursa(job #1608412)

Utilizator Vally77FMI Calinescu Valentin Gelu Vally77 Data 22 februarie 2016 02:34:22
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.32 kb
#include <iostream>
#include <fstream>
#include <list>
using namespace std;
ifstream ka("ciclueuler.in");
ofstream ki("ciclueuler.out");
const int N_MAX = 100000;
const int M_MAX = 500000;

struct muchie
{
    int index, id;
    muchie* next;
}*graf_inc[N_MAX + 1], *graf_sf[N_MAX + 1];

int stiva[M_MAX + 1];

bool folosita[M_MAX + 1];
int grad[N_MAX + 1];

int n, m, a, b;

int main()
{
    ka >> n >> m;
    for(int i = 1; i <= n; i++)
        graf_inc[i] = NULL;
    for(int i = 1; i <= m; i++)
    {
        ka >> a >> b;
        grad[a]++;
        grad[b]++;
        muchie* mm = new(muchie);
        mm->index = b;
        mm->id = i;
        if(graf_inc[a] == NULL)
        {
            graf_inc[a] = mm;
            graf_sf[a] = mm;
        }
        else
        {
            graf_sf[a]->next = mm;
            graf_sf[a] = graf_sf[a]->next;
        }
        if(a != b)
        {
            mm = new(muchie);
            mm->index = a;
            mm->id = i;
            if(graf_inc[b] == NULL)
            {
                graf_inc[b] = mm;
                graf_sf[b] = mm;
            }
            else
            {
                graf_sf[b]->next = mm;
                graf_sf[b] = graf_sf[b]->next;
            }
        }
    }
    bool eulerian = true;
    for(int i = 1; i <= n && eulerian; i++)
        if(grad[i] == 0 || grad[i] % 2 == 1)
            eulerian = false;
    //for(muchie* it = graf_inc[2]; it != NULL; it = it->next)
        //cout << it->index << " ";
    if(!eulerian)
        ki << -1;
    else
    {
        stiva[++stiva[0]] = 1;
        while(stiva[0])
        {
            int t = stiva[stiva[0]];
            bool gasita = false;
            for(muchie* it = graf_inc[t]; it != NULL && !gasita; it = it->next)
                if(!folosita[it->id])
                {
                    cout << t << " " << it->index << '\n';
                    folosita[it->id] = true;
                    gasita = true;
                    stiva[++stiva[0]] = it->index;
                    //if(it->next != NULL)
                        //it->next = it->next->next;
                }
            if(!gasita)
            {
                if(stiva[0] != 1)
                {
                    ki << t << " ";
                    cout << "Da " << t << '\n';
                }
                stiva[0]--;
            }
        }
    }
}