Cod sursa(job #1263781)

Utilizator angelaAngela Visuian angela Data 15 noiembrie 2014 08:54:51
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <cstdio>
#include <algorithm>
#include <vector>
#include <stack> 
using namespace std;

struct Edge {
	int a, b;
};

vector<vector<int>> G; 
vector<int> p, D, cycle;
int n, m;
vector<Edge> E;
vector<bool> sel;
stack<int> st;
 
int main()
{
    freopen("ciclueuler.in", "r", stdin);
    freopen("ciclueuler.out", "w", stdout);
	int a, b;
    scanf("%d %d", &n, &m);
    G.resize(n + 1);
    E.resize(m + 1); p = D = vector<int>(n + 2);
    sel.resize(m + 1);
    for (int i = 1; i <= m; ++i)
    {
        scanf("%d %d", &a, &b);
        E[i].a = a, E[i].b = b;
        G[a].push_back(i); 
        G[b].push_back(i);
        ++D[a];  ++D[b];
    }
    for (int i = 1; i <= n; ++i)
        if (D[i] % 2 == 1)
        {
            printf("-1\n");
            return 0;
        }
	int e, x;
    
    st.push(1);
    
    while ( !st.empty() )
    {
        x = st.top();
        if (p[x] < int(G[x].size())) 
        {
            for (; p[x] < int(G[x].size()); ++p[x])
            {
				e = G[x][p[x]];
                if (sel[e]) continue; 
                
                if (E[e].a == x)           
					st.push(E[e].b);    
				else
					st.push(E[e].a);
					sel[e] = true;
					
				++p[x];
				break;
			}
        }
        else
        {
            cycle.push_back(x); 
            st.pop();
        }
    }
 
    if (cycle.size() != m + 1) 
    {
        printf("-1\n");
        return 0;
    }
 
    for (size_t i = cycle.size() - 1; i >= 1; --i)
        printf("%d ", cycle[i]);
    printf("\n");
}