Cod sursa(job #2844963)

Utilizator TudosieRazvanTudosie Marius-Razvan TudosieRazvan Data 6 februarie 2022 16:23:55
Problema Ciclu Eulerian Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <fstream>
#include <vector>
#include <stack>
#define NMAX 100003
using namespace std;

int n,m;
int x,y;
int grad[NMAX];
int start[NMAX];
bool viz[500003];


ifstream fin ("ciclueuler.in");
ofstream fout ("ciclueuler.out");

struct val{
  int vecin,indMuchie;
};

vector<val>graf[NMAX];

int main()
{
    fin>>n>>m;
    for(int i=1; i<=m; i++)
    {
        fin>>x>>y;
        //pun muchiile in lista
        grad[x]++;
        grad[y]++;
        graf[x].push_back({y,i});
        graf[y].push_back({x,i});

    }

    for(int i=1; i<=n; i++)
    {
        if(grad[i]%2==1)
        {
            fout<<"-1";
            return 0;
        }

    }


    stack<int>stiva;
    stiva.push(1);
    vector<int>sol;
    while(!stiva.empty())
    {
        int nod=stiva.top();
        if(grad[nod]==0)
        {
            //fout<<nod;
            sol.push_back(nod);
            stiva.pop();
            continue;
        }
        //parcurg muchiile sa verific daca mai pot lua o muchie
        for(int i=start[nod]; i<graf[nod].size(); i++)
        {
            int cod=graf[nod][i].indMuchie;
            int nd=graf[nod][i].vecin;
            if(!viz[cod])
            {
                viz[cod]=true;
                start[nod]++;
                stiva.push(nd);
                grad[nod]--;
                grad[nd]--;
                break;
            }
        }
    }
    if(sol.size()!=m+1)
    {
        fout<<"-1";
        return 0;
    }
    for(int i=0; i<sol.size()-1; i++)
    {
        fout<<sol[i]<<" ";
    }
    return 0;
}