Cod sursa(job #1836942)

Utilizator BeilandArnoldArnold Beiland BeilandArnold Data 28 decembrie 2016 21:01:37
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <fstream>
#include <vector>
#include <list>
#include <queue>
#include <stack>
#include <algorithm>
using namespace std;


bool is_eulerian(int n, const vector<list<int>> &Adj){
    for(int i=1;i<=n;++i)
        if(Adj[i].size() % 2 !=0)
            return false;

    queue<int> q;
    vector<bool> visited(n+1,false);
    q.push(1);
    visited[1]=true;

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

        for(auto it = Adj[v].begin(); it!=Adj[v].end();++it)
            if(!visited[*it]){
                visited[*it]=true;
                q.push(*it);
            }
    }

    for(int i=1;i<=n;++i)
        if(!visited[i])
            return false;
    return true;
}


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

    int n,m;
    fin>>n>>m;

    vector< list<int> > Adj(n+1);
    for(int i=0;i<m;++i){
        int a,b;
        fin>>a>>b;
        Adj[a].push_back(b);
        Adj[b].push_back(a);
    }

    if(is_eulerian(n,Adj)){
        std::list<unsigned> ciclueul;
        std::stack<unsigned> S;
        unsigned v=1;

        do{
            while(!Adj[v].empty()){
                unsigned w=*Adj[v].begin();
                S.push(v);

                Adj[w].erase(std::find(Adj[w].begin(),Adj[w].end(),v)); //erase edge v <-> w;
                Adj[v].erase(Adj[v].begin());

                v=w;
            }
            v=S.top();
            ciclueul.push_front(v); S.pop();

        } while(!S.empty());

        for(auto i=ciclueul.begin();i!=ciclueul.end();++i) fout<<*i<<' ';
        fout<<'\n';
    }
    else
        fout<<"-1\n";
}