Cod sursa(job #2553054)

Utilizator Idk.Voicu Stefan Idk. Data 21 februarie 2020 15:56:13
Problema Ciclu Eulerian Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.57 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
using namespace std;

struct elem{int first,second;};
vector <elem> g[100010];
int n,m,viz[500010],dad[500010],sol[500010];
bool vc[500010];
stack <int >q;
ifstream fin ("ciclueuler.in");
ofstream fout ("ciclueuler.out");
 /// viz vector care marcheaza muchiile selectated
 /// g lista de adiacenta

void afisare(int n)
{
    int i;
    //cout<<i
    for(i=1; i<=n; i++)
        fout<<sol[i]<<" ";
}
void solve ()
{
    int nrm,pp,nod,elem,a,i,k=0;
    q.push(1);
    nrm=0;
    pp=0;
    while(!q.empty())
    {
        nod=q.back();
        //cout<<"\n"<<nod<<" ";
        while(!g[nod].empty()&&vc[g[nod].back().second]!=0)
            g[nod].pop_back();
        if(!g[nod].empty())
        {
            vc[g[nod].back().second]=1;
            q.push_back(g[nod].back().first);
            g[nod].pop_back();
        }
        else
        {
            if(q.size()>1)
                sol[++k]=nod;
            q.pop_back();
        }
    }
    //cout<<k<<" ";
    if(k==m)
        afisare(k);
    else
        fout<<"-1";
}
elem x;
int main()
{
    int i,a,b,pp=0;
    fin>>n>>m;
    for(i=1; i<=m; i++)
    {
        fin>>a>>b;
        x.first=b;
        x.second=i;
        g[a].push_back(x);
        x.first=a;
        x.second=i;
        g[b].push_back(x);
        viz[a]++;
        viz[b]++;
    }
    for(i=1; i<=n; i++)
        if(viz[i]%2!=0)
            pp=-1;
    if(pp==0)
    solve();
    else
        fout<<pp;
    return 0;
}