Cod sursa(job #1978340)

Utilizator EuAlexOtaku Hikikomori EuAlex Data 7 mai 2017 15:23:41
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.42 kb
#include <cstdio>
#include <vector>
#include <stack>
#include <queue>

using namespace std;

struct Edge
{
    int from;
    int to;
    bool del;
};

int const edgemax = 500000;
int const nmax = 100000;

Edge edge[1 + edgemax];
vector<int> gr[1 + nmax];
queue <int> q;
stack <int> st;

int viz[1 + nmax];

bool bfs(int n)
{
    q.push(1);
    viz[1] = 1;
    while(!q.empty())
    {
        for(int i = 0; i < gr[q.front()].size(); ++ i)
        {
            int from = edge[gr[q.front()][i]].from;
            int to = edge[gr[q.front()][i]].to;
            if(from == q.front())
            {
                if(viz[to] == 0)
                {
                    viz[to] = 1;
                    q.push(to);
                }
            }
            else
            {
                if(viz[from] == 0)
                {
                    viz[from] = 1;
                    q.push(from);
                }
            }
        }
        q.pop();
    }
    for(int i = 1; i <= n; ++ i)
    {
        if(0 < gr[i].size() && viz[i] == 0)
            return 1;
    }
    return 0;
}

int main()
{
    freopen("ciclueuler.in", "r", stdin);
    freopen("ciclueuler.out", "w", stdout);

    int n, m;
    scanf("%d%d", &n, &m);

    for(int i = 1; i <= m; ++ i)
    {
        int u, v;
        scanf("%d%d", &u, &v);
        edge[i] = {u, v, 0};
        gr[u].push_back(i);
        gr[v].push_back(i);
    }

    if(bfs(n) == 1)
    {
        printf("-1");
        return 0;
    }

    for(int i = 1; i <= n; ++ i)
    {
        if(gr[i].size() % 2 != 0)
        {
            printf("-1");
            return 0;
        }
    }

    st.push(1);
    while(!st.empty())
    {
        int nod = st.top();
        if(0 < gr[nod].size())
        {
            if(edge[gr[nod].back()].del == 0)
            {
                edge[gr[nod].back()].del = 1;
                int from = edge[gr[nod].back()].from;
                int to = edge[gr[nod].back()].to;
                if(nod == from)
                {
                    st.push(to);
                }
                else
                {
                    st.push(from);
                }
            }
            gr[nod].pop_back();
        }
        else
        {
            if(st.size() > 1)
                printf("%d ", st.top());
            st.pop();
        }
    }

    return 0;
}