Cod sursa(job #2471398)

Utilizator roberttrutaTruta Robert roberttruta Data 10 octombrie 2019 20:29:09
Problema Ciclu Eulerian Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
///implementare iterativa O(n)
#include <fstream>
#include <vector>
using namespace std;
vector < pair<int,int> > v[100005];
int n,m,i,OK,x,y,p,r,vecin,poz,afis[500005],c[500005];
int main()
{
    ifstream f("ciclueuler.in");
    ofstream g("ciclueuler.out");
///cand legam un ciclu, scoatem noduri pana ajungem la unul care mai are muchii
///libere ,iar din muchiile alea incepem alt ciclu.
    f>>n>>m;
    for(i=1;i<=m;i++)
    {
        f>>x>>y;
        v[x].push_back(make_pair(y,v[y].size()));
        v[y].push_back(make_pair(x,v[x].size()-1));
    }
    for(i=1;i<=n;i++)
    if(v[i].size()%2==1 || v[i].size()==0)
    OK=1;
    if(OK==1)
    g<<-1;
    else
    {
        p=1; c[1]=1;
        while(p)
        {
            if(v[c[p]].size())
            {
                vecin=v[c[p]][0].first;
                poz=v[c[p]][0].second;
                v[c[p]][0]=v[c[p]][v[c[p]].size()-1];
                v[c[p]].pop_back();
                v[vecin][poz]=v[vecin][v[vecin].size()-1];
                v[vecin].pop_back();
                c[++p]=vecin;
            }
            else
            {
                afis[++r]=c[p];
                p--;
            }
        }
    }
    for(i=r;i>=2;i--)
    g<<afis[i]<<' ';

    return 0;
}