Cod sursa(job #2112352)

Utilizator stefanst77Luca Stefan Ioan stefanst77 Data 23 ianuarie 2018 13:24:17
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <bits/stdc++.h>
#define nmax 100007
#define mmax 500007

using namespace std;

int n;/// nr de noduri
int st[mmax], dr[mmax], m;
/**
    st[i] - capatul din stanga a muchiei
    dr[i] - capatul din dreapta a muchiei
    m - nr de muchii
*/
vector <int>L[nmax];    /// L[i] - memoreaza numarul muchiei legat de i
bool viz[mmax]; /// contorul muchiilor vizitate
int cicluEuler[mmax], lung; /// ciclul eulerian
unsigned int poz[nmax];///   poz[i] - pozitia unde am ramas in lista de adiacenta L[i]

void Citire()
{
    ifstream fin ("ciclueuler.in");
    fin >> n >> m;
    for (int i=1; i<=m; i++)
    {
        fin >> st[i] >> dr[i];
        L[st[i]].push_back(i);
        L[dr[i]].push_back(i);
    }
    fin.close();
}

int VerificareNrMuchiiPare()
{
    int i;
    /// verificare daca exista nr par de noduri
    ///     cu un nr impar de muchii
    for (i=1; i<=n; i++)
        if (L[i].size() % 2 == 1) return 0;
    return 1;
}

void DFS(int nod)
{
    while (poz[nod] < L[nod].size())
    {
        int k = L[nod][poz[nod]++];
        if (!viz[k])
        {
            viz[k]=1;
            DFS(st[k] + dr[k] - nod);
        }
    }
    cicluEuler[++lung] = nod;
}

void GrafEulerian()
{
    ofstream fout ("ciclueuler.out");
    if (!VerificareNrMuchiiPare()) fout << "-1\n";
    else
    {
        DFS(1);
        for (int i=1; i<=lung; i++)
            fout << cicluEuler[i] << " ";
        fout << "\n";
    }
    fout.close();
}

int main()
{
    Citire();
    GrafEulerian();
    return 0;
    }