Cod sursa(job #1502293)

Utilizator dnprxDan Pracsiu dnprx Data 14 octombrie 2015 15:45:55
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.19 kb
#include <bits/stdc++.h>
#define nmax 100001
using namespace std;

vector<int> L[nmax];
int n, m, d[nmax], euler[nmax], ne;
bool viz[nmax];

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

bool ToateGradelePare()
{
    int i;
    for (i = 1; i <= n; ++i)
        if (d[i] % 2 == 1) return false;
    return true;
}

void DFS(int k)
{
    int i;
    unsigned int j;
    viz[k] = 1;
    for (j = 0; j < L[k].size(); ++j)
    {
        i = L[k][j];
        if (!viz[i]) DFS(i);
    }
}

bool EsteConex()
{
    int i;
    DFS(1);
    for (i = 1; i <= n; ++i)
        if (!viz[i]) return false;
    return true;
}

bool EsteEulerian()
{
    if (!EsteConex()) return false;
    if (!ToateGradelePare()) return false;
    return true;
}

inline void Sterge(int k, int i)
{
    unsigned int j, lung;
    lung = L[k].size();
    for (j = 0; j < lung; j++)
        if (L[k][j] == i)
        {
            L[k][j] = L[k][lung - 1];
            L[k].pop_back();
            return;
        }
}

void Euler1(int k)
{
    int i;
    while (L[k].size() > 0)
    {
        i = L[k][0];
        /// sterg muchia (k, i)
        L[k][0] = L[k][L[k].size() - 1];
        L[k].pop_back();
        /// sterg muchia (i, k)
        Sterge(i, k);
        Euler1(i);
    }
    euler[++ne] = k;
}

void Euler(int k)
{
    int i, lung;
    while (true)
    {
        lung = L[k].size();
        if (lung == 0) return;
        i = L[k][0];
        euler[++ne] = k;
        /// sterg muchia (k, i)
        L[k][0] = L[k][lung - 1];
        L[k].pop_back();
        /// sterg muchia (i, k)
        Sterge(i, k);
        /// continui cautarea din i
        k = i;
    }
}

int main()
{
    int i;
    Citire();
    ofstream fout("ciclueuler.out");
    if (!EsteEulerian()) fout << "-1\n";
    else
    {
        Euler1(1);
        for (i = 1; i < ne; ++i)
            fout << euler[i] << " ";
        fout << "\n";
    }
    fout.close();
    return 0;
}