Cod sursa(job #932536)

Utilizator razvan9310FMI - Razvan Damachi razvan9310 Data 28 martie 2013 23:54:06
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.94 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;
vector<int> stack;
bool visited[NMAX];

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);
        G[b].push_back(i);
    }
    fclose(in);
}

void DFS()
{
    stack.push_back(1);

    while (stack.size() > 0)
    {
        int node = stack[stack.size()-1];
        int i, edge, adjancted;
        for (i=0; i<G[node].size(); ++i)
        {
            visited[node] = 1;
            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;
            stack.push_back(adjancted);
            node = stack[stack.size()-1];
        }
        cycle.push_back(node);
        stack.pop_back();
    }
}

void output()
{
    FILE *out = fopen("ciclueuler.out", "w");
    bool Euler = 1;
    for (int i=1; i<=N && Euler; ++i)
        if (G[i].size()>0 || !visited[i])
            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();
    output();
    return 0;
}