Cod sursa(job #3215704)

Utilizator Razvan_GabrielRazvan Gabriel Razvan_Gabriel Data 15 martie 2024 12:01:00
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#include <iostream>
#include <fstream>
#include <bitset>
#include <vector>

using namespace std;

const int MMAX = 5 * 1e5 + 1;
const int NMAX = 1e5 + 1;

struct muchie{
    int x, y;
};

muchie e[MMAX];
bitset <MMAX> sters;
vector <int> a[NMAX];
vector <int> ciclu;
int ultim[NMAX];

int celalalt(muchie m, int x)
{
    return (m.x + m.y - x);
}

void euler(int x)
{
    while(ultim[x] < a[x].size())
    {
        int ind = a[x][ultim[x]];
        ultim[x]++;
        if(!sters[ind])
        {
            int y = celalalt(e[ind], x);
            sters[ind] = true;
            euler(y);
        }
    }
    ciclu.push_back(x);
}

bool grade_pare(int n)
{
    for(int i = 1; i <= n; i++)
        if(a[i].size() % 2 == 1)
            return false;
    return true;
}

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

    int n, m;
    fin >> n >> m;
    for(int i = 0; i < m; i++)
    {
        int x, y;
        fin >> x >> y;
        e[i].x = x;
        e[i].y = y;
        a[x].push_back(i);
        a[y].push_back(i);
    }

    euler(e[0].x);

    if(!grade_pare(n) || ciclu.size() != m + 1)
        fout << "-1";
    else
        for(int i = 0; i < ciclu.size(); i++)
            fout << ciclu[i] << " ";

    return 0;
}