Cod sursa(job #1243439)

Utilizator radarobertRada Robert Gabriel radarobert Data 15 octombrie 2014 22:00:43
Problema Ciclu Eulerian Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 2.3 kb
#include <iostream>
#include <cstdio>
#include <list>
#include <queue>
#include <stack>

#define MAX_N 100003

using namespace std;

stack <int> st;
list <int> nodes[MAX_N];
queue <int> q;
bool vis[MAX_N];
int n, m;

FILE *out = fopen("ciclueuler.out", "w");

void BFS(int x)
{
    vis[x] = 1;
    q.push(x);
    int cnode;
    while (!q.empty())
    {
        cnode = q.front();
        for(list<int>::iterator i = nodes[cnode].begin(); i != nodes[cnode].end(); i++)
        {
            if (!vis[*i])
            {
                vis[*i] = 1;
                q.push(*i);
            }
        }
        q.pop();
    }
}

bool conex()
{
    for (int i = 1; i <= n; ++i)
        if (!vis[i])
            return 0;
    return 1;
}

int eulerian()
{
    for (int i = 1; i <= n; ++i)
    {
        if (nodes[i].size() % 2 == 1)
            return 0;
    }
    return 1;
}

void deleteEdge(int v, int w)
{
    for(list<int>::iterator i = nodes[w].begin(); i != nodes[w].end(); i++)
    {
        if (*i == v)
        {
            i = nodes[w].erase(i);
            break;
        }
    }
    nodes[v].pop_front();
}

void euler(int x)
{
    st.push(x);
    fprintf(out, "%d", x);
    int v, w;
    int counter = 0;
    while (counter < m && !st.empty())
    {
        v = st.top();
        if (nodes[v].empty())
        {
            st.pop();
            continue;
        }
        w = nodes[v].front();
        deleteEdge(v, w);
        if (nodes[v].empty())
            st.pop();
        if (!nodes[w].empty())
        {
            st.push(w);
            fprintf(out, " %d", w);
        }
    }
    fprintf(out, " %d\n", w);
}

void solPrint()
{
    if (conex() == false)
    {
        fprintf(out, "-1\n");
        fclose(out);
        return;
    }

    int x = eulerian();
    if (x == 1)
        euler(1);
    else
        fprintf(out, "-1\n");
    fclose(out);
}

void read()
{
    FILE *in = fopen("ciclueuler.in", "r");

    fscanf(in, "%d%d", &n, &m);

    int x, y;
    for (int i = 1; i <= m; i++)
    {
        fscanf(in, "%d%d", &x, &y);
        nodes[x].push_back(y);
        nodes[y].push_back(x);
    }
    fclose(in);
}

int main()
{
    read();
    BFS(1);
    solPrint();


    return 0;
}