Cod sursa(job #2874847)

Utilizator alexmorosanuMorosanu Alexandru alexmorosanu Data 20 martie 2022 12:53:11
Problema Ciclu Eulerian Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.06 kb

#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
vector <int> v[100011],back_edge[100011],to_edge[100011];
bool fost[100011];
void dfs(int k)
{
    fost[k]=1;
    while(v[k].empty()==false)
    {
        auto it=v[k].begin();
        int p=*it;
        v[k].erase(it);
        auto it1=find(v[p].begin(),v[p].end(),k);
        v[p].erase(it1);
        if(fost[p]==1)
        {
            back_edge[k].push_back(p);
            back_edge[p].push_back(k);
        }
        else
        {
            to_edge[k].push_back(p);
            to_edge[p].push_back(k);
            dfs(p);
        }
    }
}
vector <int> sol;
int n,m,i,nod,stop,tata,muc,x,y,j,mult[100011];
int main()
{
    f>>n>>m;
    for(i=1;i<=m;i++)
    {
        f>>x>>y;
        v[x].push_back(y);
        v[y].push_back(x);
    }
    for(i=1;i<=n;i++)
        if(v[i].size()%2==1)
        {
            g<<-1;
            return 0;
        }
    dfs(1);
    nod=stop=1;
    tata=muc=0;
    while(stop)
    {
        sol.push_back(nod);
        stop=0;
        if(muc==0)
        {
            auto it=find(back_edge[nod].begin(),back_edge[nod].end(),tata);
            if(it!=back_edge[nod].end())
                back_edge[nod].erase(it);
        }
        else
        {
            auto it=find(to_edge[nod].begin(),to_edge[nod].end(),tata);
            if(it!=to_edge[nod].end())
                to_edge[nod].erase(it);
        }
        if(back_edge[nod].size()>0)
        {
            tata=nod;
            nod=back_edge[nod].back();
            back_edge[tata].pop_back();
            muc=0;
            stop=1;
        }
        else
        if(to_edge[nod].size()>0)
        {
            tata=nod;
            nod=to_edge[nod].back();
            to_edge[tata].pop_back();
            muc=1;
            stop=1;
        }
    }
    for(auto it=sol.begin();it!=sol.end();it++)
        for(i=0;i<=mult[*it];i++)
            g<<*it<<" ";
    return 0;
}