Mai intai trebuie sa te autentifici.

Cod sursa(job #1462950)

Utilizator CollermanAndrei Amariei Collerman Data 19 iulie 2015 14:39:04
Problema Ciclu Eulerian Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 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()
{
    int v = 1, w = 0;

    while(true) {
        if(!Graf[v].empty()) w = Graf[v].back();
        else break;
        sterge(v, w);
        S.push(v);
        v = w;
    }
}

void afis()
{
    while(!S.empty()) {
        fout << S.top() << ' ';
        S.pop();
    }
}

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

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

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