Cod sursa(job #3339786)

Utilizator zionlyismAdobroaiei David zionlyism Data 10 februarie 2026 09:01:38
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <fstream>
#include <vector>

#define NMAX 100002
#define MMAX 500002
using namespace std;

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

struct muchie {int x, nr;};

int n, m;
vector<muchie>G[NMAX];

vector<int> C;
bool sters[MMAX];


void citire();
void euler(int x);
bool okgrade();

int main()
{
    int i;
    citire();
    if(!okgrade())
    {
        fout<<-1<<'\n';
        return 0;
    }
    for(i = 1; i <= n; i++)
        if(G[i].size()) //primul nod neizolat
        {
            euler(i);
            break; //oricum ma intereseaza doar o comp conexa (daca are mai multe nu este eulerian)
        }
    if(C.size() != m + 1)
    {
       fout<<-1<<'\n';
       return 0;
    }
    for(i = 0; i < C.size() - 1; i++)
        fout<<C[i]<<' ';
    fout<<'\n';
    return 0;
}

void citire()
{
 int i, x, y;
 fin>>n>>m;
 for(i = 1; i <= m; i++)
 {
     fin>>x>>y;
     G[x].push_back({y, i});
     G[y].push_back({x, i});
 }
}

bool okgrade()
{
 int i;
 for(i = 1; i <= n; i++)
    if(G[i].size() % 2)
    {
       return 0;
    }
 return 1;
}

void euler(int x)
{
 muchie m;
 while(G[x].size()) //cat timp mai are vecini
 {
     m = G[x].back(); G[x].pop_back();
     if(!sters[m.nr])
     {
        sters[m.nr] = 1;
        euler(m.x);
     }
 }
 C.push_back(x);
}