Cod sursa(job #3293352)

Utilizator Sorin_GabrielGabara Sorin Gabriel Sorin_Gabriel Data 11 aprilie 2025 15:30:53
Problema Ciclu Eulerian Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.29 kb
#include <iostream>
#include <bits/stdc++.h>
#define VMAX 100005
#define INF 100000000
#define int long long int
using namespace std;
ifstream fin ("ciclueuler.in");
ofstream fout ("ciclueuler.out");

bool scos[5*VMAX]; // cate legaturi sunt
vector<pair<int,int>> graf[VMAX];
vector<int> parcurs;
int conexiuni_insisi[VMAX];

void dfs(int nod)
{
    int i;
    pair<int,int> k;

    for(i=graf[nod].size()-1;i>=0;i=min(i-1,(int)graf[nod].size()-1))
    {
        k = graf[nod][i];
        if(scos[graf[nod][i].second])
            graf[nod].pop_back();
        else
        {
            scos[graf[nod][i].second]=1;
            graf[nod].pop_back();
            dfs(k.first);
        }
    }
    parcurs.push_back(nod);
}


void idkfs(int nod)
{
    int i;
    pair<int,int> k;
    vector<int> q;

    while(q.size())
    {
        nod = q.front();
        for(i=graf[nod].size()-1;i>=0;i=min(i-1,(int)graf[nod].size()-1))
        {
            k = graf[nod][i];
            if(scos[graf[nod][i].second])
                graf[nod].pop_back();
            else
            {
                scos[graf[nod][i].second]=1;
                graf[nod].pop_back();
                q.push_back(graf[nod][i].first);
                break;
            }
        }
        parcurs.push_back(q.back());
        q.pop_back();
    }

}


signed main()
{
    int n,m,i,j,k,t,q,nr,p,suma,maxim,aparitii,candidat,st,dr,mij,i_max,j_max;
    fin>>n>>m;
    for(i=0;i<m;i++)
    {
        fin>>j>>k;
        if(j==k)
        {
            conexiuni_insisi[j]++;
            continue;
        }
        graf[j].push_back({k,i});
        graf[k].push_back({j,i});
    }

    for(i=1;i<=n;i++)
        if(graf[i].size()%2)
            break;
    if(i<=n)
    {
        fout<<"-1\n";
        return 0;
    }

    dfs(1);

    for(i=1;i<=n;i++)
        if(graf[i].size())
            break;
    if(i<=n)
    {
        fout<<"-1\n";
        return 0;
    }

    while(!parcurs.empty())
    {
        fout<<parcurs.back()<<' ';
        while(conexiuni_insisi[parcurs.back()])
        {
            conexiuni_insisi[parcurs.back()]--;
            fout<<parcurs.back()<<' ';
        }
        parcurs.pop_back();
    }
    fout<<'\n';




    return 0;
}