Cod sursa(job #1716315)

Utilizator stefan_bogdanstefan bogdan stefan_bogdan Data 12 iunie 2016 14:21:14
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <iostream>
#include <stdio.h>

#define MAXN 100000+10
#define MAXM 500000+10

using namespace std;

FILE *f, *g;
int n, m, k, vf=1, ind;
int fr[MAXN], t[2][1000000+10], start[MAXN], sol[MAXM], st[MAXM];


void citire ()
{
    int x, y; st[1]=1;
    fscanf(f, "%d %d", &n, &m);
    for (int i = 1; i <= m; i++)
    {
        fscanf(f, "%d %d", &x, &y);
        fr[x]++; fr[y]++;
        k++; t[0][k] = x; t[1][k] = start[y]; start[y] = k;
        k++; t[0][k] = y; t[1][k] = start[x]; start[x] = k;
    }
}
bool cond ()
{
    for (int i = 1; i <= n; i++)
        if (fr[i] % 2 != 0)
            return false;
    return true;
}
void sterge_muchie (int nd, int k)
{
    int nod = t[0][k]; t[0][k] = -1;
    int p = start[nod];
    while (p)
    {
        if (t[0][p] == nd) { t[0][p] = -1;  break; }
        p = t[1][p];
    }
}
void euler ()
{
    while (vf)
    {
        int p = start[st[vf]], found = 0;
        while (p != 0)
        {
            if (t[0][p] != -1)
            {   found = 1;
                st[++vf] = t[0][p];
                sterge_muchie(st[vf-1], p);
                start[st[vf-1]] = p;
                break;
            }
            p = t[1][p];
        }

        if(!found)
            sol[++ind] = st[vf], vf--;
    }
}
int main()
{
    f = fopen("ciclueuler.in", "r");
    g = fopen("ciclueuler.out", "w");

    citire();
    if (!cond())
        fprintf(g, "-1");
    else
    {
        euler();
        for (int i = 1; i <= ind; i++)
            fprintf(g, "%d ", sol[i]);
    }

    fclose(f);
    fclose(g);

    return 0;
}