Cod sursa(job #3203452)

Utilizator AlexandruDrg23Draghici Alexandru AlexandruDrg23 Data 13 februarie 2024 18:08:12
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.95 kb
#include <iostream>
#include <fstream>
#include <stack>
#include <vector>
using namespace std;

ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");

vector<vector<pair<int,int>>>ma;
stack<int> st;
stack<int> nodu;
vector<bool> vf;

/*void dfs(int nod)
{
    for(int k=ma[nod][0].second;k<=ma[nod][0].first;k++)
    {
        if(vf[ma[nod][k].first]==false)
        {
            vf[ma[nod][k].first]=true;
            dfs(ma[nod][k].second);
        }
    }
    st.push(nod);
}*/


int main()
{
    int n,m;
    fin>>n>>m;
    vector<pair<int,int>> v;
    v.push_back({0,1});
    ma.resize(n+1,v);
    vf.resize(m+1,false);
    pair<int,int> el;
    for(int k=1;k<=m;k++)
    {
        fin>>el.first>>el.second;
        ma[el.first].push_back({k,el.second});
        ma[el.second].push_back({k,el.first});
        ma[el.first][0].first++;
        ma[el.second][0].first++;
    }
    for(int k=1;k<=n;k++)
    {
        if(ma[k][0].first%2==1)
        {
            fout<<-1;
            return 0;
        }
    }
    int c=1;
    while(ma[c][0].first==0)
        c++;
    nodu.push(c);
    vector<pair<int,int>>::iterator k;
    ///cout<<((ma[3].end()-1)->first)<<" "<<((ma[3].end()-1)->second)<<endl;
    while(!nodu.empty())
    {
        k=ma[nodu.top()].end()-1;
        if(k!=ma[nodu.top()].begin())
        {
            if(vf[(*k).first]==false)
            {
                ma[nodu.top()].pop_back();
                nodu.push((*k).second);
                vf[(*k).first]=true;
            }
            else
                ma[nodu.top()].pop_back();
        }
        else
        {
            st.push(nodu.top());
            nodu.pop();
        }

    }
    for(int k=1;k<=m;k++)
    {
        if(vf[k]==false)
        {
            fout<<-1;
            return 0;
        }
    }
    while(!st.empty())
    {
        fout<<st.top()<<' ';
        st.pop();
    }
    return 0;
}