Cod sursa(job #984945)

Utilizator classiusCobuz Andrei classius Data 15 august 2013 20:52:12
Problema Ciclu Eulerian Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream>
#include <list>
#include <queue>
#include <stack>

using namespace std;

ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");

int main()
{
    int n,m;
    list<int> li[100001];

    f>>n>>m;

    for(int i=1;i<=m;i++){
        int x,y;
        f>>x>>y;
        li[y].push_back(x);
        li[x].push_back(y);
    }

    bool ok[100001]={};
    queue<int> q;
    q.push(1);
    ok[1]=1;

    while(!q.empty()){
        int x=q.front();
        q.pop();
        for(list<int>::iterator it=li[x].begin();it!=li[x].end();it++)
            if(!ok[*it]){
                q.push(*it);
                ok[*it]=1;
            }
    }

    for(int i=1;i<=n;i++)
        if(li[i].size()%2||!ok[i]){
            g<<-1;
            return 0;
        }

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

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

        while(true){
            if(li[x].empty())
                break;
            int ax=li[x].front();
            li[x].pop_front();
            for(list<int>::iterator it=li[ax].begin();;it++)
                if(*it==x){
                    li[ax].erase(it);
                    break;
                }
            st.push(x);
            x=ax;
        }
        sl.push_back(x);
    }

    for(unsigned j=0;j<sl.size()-1;j++)
        g<<sl[j]<<" ";



    return 0;
}