Cod sursa(job #2331236)

Utilizator DanutAldeaDanut Aldea DanutAldea Data 29 ianuarie 2019 13:15:41
Problema Ciclu Eulerian Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.23 kb
#include <fstream>
#include <vector>
#include <bitset>

using namespace std;

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

int n,m,i,j,x,y;
vector <pair <int,int> >l[100001];
int g[100001];
bitset <500001>f;
int st[100001],k;
int nod,vecin,sol[500001];

int dfs(int nod){
    for(int i=0;i<l[nod].size();i++)
        if(f[l[nod][i].first]==0){
            f[l[nod][i].first]=1;
            dfs(l[nod][i].first);
        }
}

int main(){
    fin>>n>>m;
    for(i=1;i<=m;i++){
        fin>>x>>y;
        g[x]++; g[y]++;

        l[x].push_back(make_pair(y,i));
        l[y].push_back(make_pair(x,i));
    }

    dfs(1);
    for(i=1;i<=n;i++)
        if(!f[i] || g[i]%2==1){
            fout<<"-1";
            return 0;
        }

    f.reset();
    st[++k]=1;
    while(k){
        nod=st[k];
        if(g[nod]==0){
            if(k!=1)
                fout<<nod<<" ";
            k--;
            continue;
        }
        while(f[ l[nod].back().second] ==1)
            l[nod].pop_back();

        vecin=l[nod].back().first;
        f[l[nod].back().second]=1;
        l[nod].pop_back();
        g[nod]--; g[vecin]--;

        k++;
        st[k]=vecin;
    }

    return 0;
}