Cod sursa(job #3004663)

Utilizator MateiCatalinUrsache Matei MateiCatalin Data 16 martie 2023 15:24:51
Problema Ciclu Eulerian Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.33 kb
#include <fstream>
#include <vector>
#include <stack>
#include <vector>
#include <algorithm>

using namespace std;

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

int n,m;
int grad[100001];

stack <int> S;
vector <int> lista[100001];

struct muchie{
    int x,y;
    bool used;
}M[500001];


void euler()
{
    if(!S.empty())
    {
        int nod=S.top();
        if(grad[nod]==0)
        {
            g<<nod<<" ";
            S.pop();
        }
        else
        {
            for(auto it:lista[nod])
            {
                if(M[it].used==false)
                {
                    grad[M[it].x]--;
                    grad[M[it].y]--;
                    M[it].used=true;
                    S.push(M[it].x+M[it].y-nod);
                    euler();
                }
            }
            euler();
        }
    }
}

int main()
{
    f>>n>>m;
    for(int i=1;i<=m;i++)
    {
        int x,y;
        f>>x>>y;
        grad[x]++;
        grad[y]++;
        lista[x].push_back(i);
        lista[y].push_back(i);
        M[i].x=x;
        M[i].y=y;
        M[i].used=false;
    }
    S.push(1);
    int s=0;
    for(int i=1;i<=n;i++)
    {
        if(grad[i]%2==1)
            s=1;
    }
    if(s==1)
        g<<-1;
    else
        euler();
    return 0;
}