Cod sursa(job #2820062)

Utilizator MadalinaKopaczMadalina Kopacz MadalinaKopacz Data 19 decembrie 2021 20:10:15
Problema Ciclu Eulerian Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.73 kb
#include <bits/stdc++.h>
using namespace std;

//https://www.geeksforgeeks.org/eulerian-path-and-circuit/
int N, M;
vector<vector<pair<int, int>>> citireLisAdiacenta()
{
    ifstream fin("ciclueuler.in");
    vector<vector<pair<int,int>>> lisAdiacenta;


    fin >> N >> M;
    lisAdiacenta.resize(N+1);

    for (int i = 1; i <= M; ++i) {
        int x, y;
        fin >> x >> y;
        lisAdiacenta[x].push_back({i,y});
        lisAdiacenta[y].push_back({i,x});
    }

    return lisAdiacenta;
}
/*
vector<vector<pair<int, int>>> lisAdiacIndexMuchii(vector<vector<int>> &lisAdiacenta)
{
    vector<vector<pair<int, int>>> graf(lisAdiacenta.size());
    for(int i = 1; i < lisAdiacenta.size(); ++i) {
        for(int j = 0; j < lisAdiacenta[i].size(); ++j) {
            graf[i].push_back({-1, lisAdiacenta[i][j]});
        }
    }
    int nr = 1;
    for(int i = 1; i < lisAdiacenta.size(); ++i) {
        for(int j = 0; j < lisAdiacenta[i].size(); ++j) {
            if(graf[i][j].first == -1) {
                graf[i][j].first = nr;

                for(int k = 0; k < lisAdiacenta[lisAdiacenta[i][j]].size(); ++k) {
                    if (lisAdiacenta[lisAdiacenta[i][j]][k] == i && graf[lisAdiacenta[i][j]][k].first == -1) {
                        graf[lisAdiacenta[i][j]][k].first = nr;
                        break;
                    }
                }
                nr++;
            }
        }
    }
    return graf;

}*/


vector<int> cicluEuler(vector<vector<pair<int, int>>> &lisAdiacenta)
{

    vector<int> ciclu;
    vector<bool> eliminat(M+1, 0);

    for(int i = 1; i < lisAdiacenta.size(); ++i) {
        if(lisAdiacenta[i].size() %2 == 1) {
            ciclu.push_back(-1);
            ciclu.push_back(-1);
            return ciclu;
        }
    }

    stack<int> drumCurent;
    //incepem din primul nod
    drumCurent.push(1);


    while (!drumCurent.empty()) {
        int nodCurent = drumCurent.top();
        if (lisAdiacenta[nodCurent].size()) {
            pair<int,int> nodUrm = lisAdiacenta[nodCurent].back();
            lisAdiacenta[nodCurent].pop_back();

            if(!eliminat[nodUrm.first])    {
                drumCurent.push(nodUrm.second);
                eliminat[nodUrm.first]=1;
            }
        } else {
            ciclu.push_back(nodCurent);
            drumCurent.pop();
        }
    }

    return ciclu;
}

int main()
{
    ofstream fout("ciclueuler.out");
    vector<vector<int>> lisAdiacenta;
 vector<vector<pair<int, int>>> lisInd = citireLisAdiacenta();
    vector<int> ciclu = cicluEuler(lisInd);
    for(int i = 0; i < ciclu.size()-1; ++i) {
        fout << ciclu[i] << " ";
    }
    fout.close();

    return 0;
}