Cod sursa(job #2822518)

Utilizator IoanaLiviaPopescu15Ioana Livia IoanaLiviaPopescu15 Data 24 decembrie 2021 01:41:04
Problema Ciclu Eulerian Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.38 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
#include <queue>
#include <deque>
#include <algorithm>
#include <utility>
#define N 100001
#define NN 101
#define oo  0x3f3f3f3f

using namespace std;

	
class Graph {
	
public:

    void Solve_Eulerian();
    
};
	




void Graph::Solve_Eulerian() {

    ifstream in("ciclueuler.in");
    ofstream out("ciclueuler.out");
    
    vector<int> output; //vector output pentru raspuns

    int M, n, x, y, current, next_node, next_index; //plus N definit 100001
    in>>n>>M;
    
    bool visited_muchii[M]; //vector visited pentru muchii

    vector <pair<int, int>> evidenta[N];  //in evidenta voi retine pentru fiecare nod: (indice muchie, celalalt capat al muchiei)

    for (int i = 0; i < M; i++)
	{
	     in >> x >> y ;
	     evidenta[x].push_back(make_pair(i,y));
         evidenta[y].push_back(make_pair(i,x));
    }

    // //parcurgere
    // for(int i = 1; i <= n; ++i)
    // {
    //     out<<"Pentru nodul i = "<<i<<" avem "<<evidenta[i].size()<<endl;
    //     for(auto index : evidenta[i])
    //         out<<index.first<<' '<<i<<' '<<index.second<<endl;
    //     out<<endl;
    // }
    
    for(int i = 0; i < M; ++i)
        if(evidenta[i].size() % 2 != 0)
        {
            out<<-1; return;
        }

    deque <int> dq;     //in dq retin nodurile pentru care trebuie sa fac parcurgeri in continuare
    dq.push_front(1);   //incep de la 1
	
    while(dq.size()!= 0){
        current = dq.front();
	
        if(evidenta[current].size() != 0)
        {
            next_index = evidenta[current][evidenta[current].size()-1].first;
	
            if(!visited_muchii[next_index])
            {
                visited_muchii[next_index] = true;
                next_node = evidenta[current][evidenta[current].size()-1].second;
                dq.push_front(next_node);
            }
            
            evidenta[current].pop_back();
	
        }
	
        else
        {
            output.push_back(current);
            dq.pop_front();
        }
    }
 
    // output.pop_back(); //scot de la capat primul nod pe care formatul de afisare nu il prevede
    // for(auto node : output) out<<node<<' ';

    out<<1;
    
    in.close();
    out.close();
	
}


int main()
{
    Graph g;
    
    g.Solve_Eulerian();


    return 0;
}