Cod sursa(job #932509)

Utilizator razvan9310FMI - Razvan Damachi razvan9310 Data 28 martie 2013 23:25:13
Problema Ciclu Eulerian Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <cstdio>
#include <cstdlib>
#include <vector>
#define NMAX 100010
#define MMAX 500010
using namespace std;

struct Edge
{
    int v1, v2;
}E[MMAX];

int N, M;
vector<int> G[NMAX], cycle;

void input()
{
    FILE *in = fopen("ciclueuler.in", "r");
    fscanf(in, "%d%d", &N, &M);
    int i, a, b;
    for (i=0; i<M; ++i)
    {
        fscanf(in, "%d%d", &a, &b);
        E[i].v1 = a;
        E[i].v2 = b;
        G[a].push_back(i);
        if (a != b)
            G[b].push_back(i);
    }
    fclose(in);
}

void DFS(int node)
{
    int i, edge, adjancted;
    for (i=0; i<G[node].size(); ++i)
    {
        edge = G[node][i];
        if (E[edge].v1 != node)
            adjancted = E[edge].v1;
        else adjancted = E[edge].v2;
        G[node][i] = G[node][G[node].size()-1];
        G[node].pop_back();

        for (int j=0; j<G[adjancted].size(); ++j)
            if (G[adjancted][j] == edge)
            {
                G[adjancted][j] = G[adjancted][G[adjancted].size()-1];
                G[adjancted].pop_back();
                break;
            }
        --i;
        DFS(adjancted);
    }
    cycle.push_back(node);
}

void output()
{
    FILE *out = fopen("ciclueuler. out", "w");
    bool Euler = 1;
    for (int i=1; i<=N && Euler; ++i)
        if (G[i].size() > 0)
            Euler = 0;
    if (!Euler) fprintf(out, "-1");
    else
    {
        int j, SIZE = cycle.size();
        for (j=0; j<SIZE-1; ++j)
            fprintf(out, "%d ", cycle[j]);
    }
    fclose(out);
}

int main()
{
    input();
    DFS(1);
    output();
    return 0;
}