Cod sursa(job #2471519)

Utilizator roberttrutaTruta Robert roberttruta Data 11 octombrie 2019 08:01:57
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.72 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],nr[100005],s[100005],j;
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;
        if(x!=y)
        {
        v[x].push_back(make_pair(y,v[y].size()));
        v[y].push_back(make_pair(x,v[x].size()-1));
        }
        else
        {
        v[x].push_back(make_pair(y,v[y].size()+1));
        v[y].push_back(make_pair(x,v[x].size()-1));
        }
        nr[x]++;
        nr[y]++;
    }
    for(i=1;i<=n;i++)
    if(nr[i]%2==1 || nr[i]==0)
    OK=1;
    if(OK==1)
    g<<-1;
    else
    {
        p=1; c[1]=1;
        while(p)
        {
            if(nr[c[p]])
            {
                for(i=s[c[p]];i<v[c[p]].size();i++)
                {
                    s[c[p]]++;
                    if(v[c[p]][i].first!=0)
                    {
                       vecin=v[c[p]][i].first;
                       poz=v[c[p]][i].second;
                       v[c[p]][i].first=0;
                       v[vecin][poz].first=0;
                       nr[c[p]]--;
                       nr[vecin]--;
                       c[++p]=vecin;
                       break ;
                    }
                }
            }
            else
            {
                afis[++r]=c[p];
                p--;
            }
        }
    }
    for(i=r;i>=2;i--)
    g<<afis[i]<<' ';

    return 0;
}