Cod sursa(job #2820165)

Utilizator Costin_PintilieHoratiu-Costin-Petru Pintilie Costin_Pintilie Data 19 decembrie 2021 22:57:52
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.93 kb
#include <bits/stdc++.h>

#define NMAX 100005
//http://www.graph-magics.com/articles/euler.php

//avand in vedere ca graful este neorientat nu vom putea sterge usor o muchie din listele de adiacenta a celor 2 noduri pe care le leaga,
// deci lista de adiacenta va tine minte pt fiecare nod atat celalat nodul vecin cat si index ul muchiei ce leaga nodurile
using namespace std;

int n,m;
vector< vector < pair<int,int> > > adj(NMAX);

void EulerRead(){
    ifstream fin("ciclueuler.in");
    fin>>n>>m;
    adj.resize(n + 1);

    for(int i = 0; i < m; i++)
    {
        int x, y;
        fin>>x>>y;
        adj[x].push_back(make_pair(y,i));  //  muchia cu index i leaga nodul x de nodul y
        adj[y].push_back(make_pair(x,i));  //  aceeasi muchie leaga totodata si y de x
    }
    fin.close();
}

void Euler(){
    ofstream fout("ciclueuler.out");

    for(int i = 1; i <= n; i++)
    {
            if(adj[i].size() % 2 != 0)
            {
            fout<<"-1";
            fout.close();
            exit(0);
            }
    }

    vector<bool> usedEdge(m+1,0); //vector ce minte daca o muchie a fost utilizata in ciclu
    vector<int> result;
    stack<int> curr_node;

    curr_node.push(1);

    while(!curr_node.empty())
    {
        int node = curr_node.top();

        if(!adj[node].empty())
        {
            //int next_node = (adj[curr_node].back()).first();
            pair<int,int> next_node = adj[node].back();
            adj[node].pop_back();

            if(!usedEdge[next_node.second])
            {
                usedEdge[next_node.second] = true;
                curr_node.push(next_node.first);

            }

        }else{
            result.push_back(node);
            curr_node.pop();
        }
    }
    for(int i = 0; i < result.size(); i++)
        fout<< result[i]<< " ";

    fout.close();
}

int main(){
    EulerRead();
    Euler();

    return 0;
}