Cod sursa(job #2470135)

Utilizator TrolliciousSir Troll Trollicious Data 8 octombrie 2019 19:06:52
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.51 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <bits/stdc++.h>
using namespace std;

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

int n,m;
stack <int> st,sol;
struct fiu
{
    int vecin,muchia;
};
vector <fiu> v[100010];
bool viz[500010];
int lg[100010];

void cit()
{
    f>>n>>m;
    int i;
    for(i=1; i<=m; i++)
    {
        int x,y;
        f>>x>>y;
        v[x].push_back({y,i});
        v[y].push_back({x,i});
    }
}

bool verif()
{
    int i;
    for(i=1; i<=n; i++)
        if(v[i].size()%2==1||v[i].size()==0)
        {
            g<<"-1";
            return false;
        }
    return true;
}

void Euler()
{
    if(verif())
    {
        st.push(1);
        while(!st.empty())
        {
            int nod=st.top();
            if(lg[nod]<v[nod].size())
            {
                int nodvecin=v[nod][lg[nod]].vecin;
                int poz=v[nod][lg[nod]].muchia;
                lg[nod]++;
                if(!viz[poz])
                {
                    viz[poz]=1;
                    st.push(nodvecin);
                }
            }
            else
            {
                st.pop();
                sol.push(nod);
            }

        }
    }
}

void afis()
{
    while(!sol.empty())
    {
        int poz=sol.top();
        sol.pop();
        if(!sol.empty())
            g<<poz<<" ";
    }
}

int main()
{
    cit();
    Euler();
    afis();
    return 0;
}