Cod sursa(job #1784046)

Utilizator filip.mihalutMihalut Filip filip.mihalut Data 19 octombrie 2016 18:52:27
Problema Ciclu Eulerian Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include <queue>
#include <stack>

using namespace std;

ifstream f ("ciclueuler.in");
ofstream g ("ciclueuler.out");

int a[101][101];
int vizitat[101],n,i,x,y,m,nod;
queue < int > Q;
vector < int > v[101];
vector < int > :: iterator ii;
stack < int > st;

bool bun()
{
    for(int i = 1; i <= n; i++)
        if(vizitat[i] % 2 != 0)
            return false;
    return true;
}

bool dfs()
{
    memset(vizitat,0,sizeof(vizitat));
    int k = 1;
    Q.push(1);
    vizitat[1] = 1;
    while(!Q.empty())
    {
        x = Q.front();
        Q.pop();
        ii = v[x].begin();
        while(ii != v[x].end())
        {
            if(!vizitat[*ii])
                vizitat[*ii] = 1,Q.push(*ii),k++;
            ii++;
        }
    }
    if(k == n)
        return true;
    return false;
}

void bfs()
{
    st.push(1);
    while(!st.empty())
    {
        int k = 0,poz = 0;
        nod = st.top();
        ii = v[nod].begin();
        while(ii != v[nod].end())
        {
            if(a[nod][*ii] != 0)
                poz = *ii,k = 1;
            ii++;
        }
        if(k == 1)
            st.push(poz),a[nod][poz]--,a[poz][nod]--;
        else
        {
            st.pop();
            if(!st.empty())
                g << nod <<" ";
        }
    }
}

int main()
{
    f >> n >> m;
    for(i = 1; i <= m; i++)
    {
        f >> x >> y;
        vizitat[x]++;
        vizitat[y]++;
        v[x].push_back(y);
        v[y].push_back(x);
        a[x][y]++;
        a[y][x]++;
    }
    if(bun() && dfs())
        bfs();
    else
        g << -1;
    return 0;
}