Cod sursa(job #1248611)

Utilizator PhilipDumitruPhilip Dumitru PhilipDumitru Data 25 octombrie 2014 17:02:06
Problema Ciclu Eulerian Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.91 kb
#include <fstream>
#include <list>
#include <stack>
#include <queue>

using namespace std;

list<int> adiac[100001];
char visited[100001];

int n;
list<int>::iterator it;

ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");

bool isEuler()
{
    for (int i = 1; i <= n; ++i)
        if (adiac[i].size() % 2)
            return false;
    return true;
}

bool isConvex()
{
    queue<int> q;
    q.push(1);
    int i, k = 1;
    visited[1] = 1;
    while (!q.empty())
    {
        i = q.front();
        q.pop();
        for (it = adiac[i].begin(); it != adiac[i].end(); ++it)
        {
            if (!visited[*it])
            {
                q.push(*it);
                visited[*it] = ++k;
            }
        }
    }
    if (n == k)
        return true;
    return false;
}

void showEuler(int start)
{
    stack<int> st;
    st.push(start);
    int top, next;
    while(!st.empty())
    {
        top = st.top();
        while (!adiac[top].empty())
        {
            next = adiac[top].front();
                adiac[top].pop_front();
                for (it = adiac[next].begin(); *it != top; ++it);
                adiac[next].erase(it);
            st.push(next);
            top = st.top();
        }
        if (st.size() > 1)
        fout<< st.top() << " ";
        st.pop();
    }
}

int main()
{
    //FILE *fin = fopen("ciclueuler.in", "r");
    //FILE *fout = fopen("ciclueuler.out", "w");

    int m, i, j;
    //fscanf(fin, "%d %d", &n, &m);
    fin >> n >> m;
    while (m--)
    {
        fin >> i >> j;
        //fscanf(fin, "%d %d", &i, &j);
        adiac[i].push_front(j);
        adiac[j].push_front(i);
    }
    if (isConvex() && isEuler())
    {
        showEuler(1);
        fout << "\n";
    }
    else
        fout << "-1\n";
        //fprintf(fout, "")

    //fclose(fin);
    //fclose(fout);
    return 0;
}