Cod sursa(job #1465197)

Utilizator CollermanAndrei Amariei Collerman Data 26 iulie 2015 18:32:02
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include <fstream>
#include <vector>
#include <bitset>
#include <queue>
#include <stack>
#include <algorithm>
using namespace std;
ofstream fout("ciclueuler.out");
ifstream fin("ciclueuler.in");
const int NMAX = 100010;

int n, m;
int Grad[NMAX];
stack<int> S;
bitset<NMAX> Viz;
vector<int> Graf[NMAX];

void citire()
{
    int x, y;

    fin >> n >> m;
    for(int i=1; i<=m; i++) {
        fin >> x >> y;
        Graf[x].push_back(y);
        Graf[y].push_back(x);
        Grad[x]++;
        Grad[y]++;
    }
}

int bfs()
{
    queue<int> q;
    q.push(1);
    Viz[1] = true;

    while(!q.empty())
    {
        int nod = q.front();
        q.pop();

        for(auto x : Graf[nod]) {
            if(!Viz[x]) {
                Viz[x] = true;
                q.push(x);
            }
        }
    }

    for(int i=1; i<=n; i++) if(!Viz[i]) return -1;
    return 1;
}

int eulerian()
{
    for(int i=1; i<=n; i++)
        if(Grad[i] & 1)
            return -1;
    return 1;
}

void sterge(int a, int b)
{
    Graf[a].pop_back();
    vector<int>::iterator it = find(Graf[b].begin(), Graf[b].end(), a);
    Graf[b].erase(it);
}

void euler()
{
    S.push(1);
    while(!S.empty()) {
        int nod = S.top();

        if(Graf[nod].size()) {
            S.push(Graf[nod].back());
            sterge(nod, Graf[nod].back());
        }
        else {
            fout << nod << ' ';
            S.pop();
        }
    }
}

void verifica()
{
    if(eulerian() == -1) { fout << -1; return; }
    if(bfs() == -1) { fout << -1; return; }
    euler();
}

int main()
{
    citire();
    verifica();

    fout.close();
    fin.close();
    return 0;
}