Cod sursa(job #1836919)

Utilizator BeilandArnoldArnold Beiland BeilandArnold Data 28 decembrie 2016 20:33:09
Problema Ciclu Eulerian Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <fstream>
#include <vector>
#include <list>
#include <queue>
#include <stack>
#include <algorithm>
using namespace std;


bool is_eulerian(int n, 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 i : Adj[v])
            if(!visited[i]){
                visited[i]=true;
                q.push(i);
            }
    }

    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)){
        list<int> ciclu;

        stack<int> st;
        st.push(1);

        while(!st.empty()){
            int v = st.top();

            if(Adj[v].empty()){
                ciclu.push_back(v);
                st.pop();
            }
            else{
                int w = *Adj[v].begin();
                Adj[v].pop_front();
                Adj[w].erase(find(Adj[w].begin(),Adj[w].end(),v));
                st.push(w);
            }
        }


        for(int i : ciclu) fout<<i<<' ';
        fout<<'\n';
    }
    else
        fout<<"-1\n";
}