Pagini recente » Cod sursa (job #2760224) | Cod sursa (job #3171763) | Cod sursa (job #999145) | Cod sursa (job #2261775) | Cod sursa (job #2822514)
#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<<' ';
in.close();
out.close();
}
int main()
{
Graph g;
g.Solve_Eulerian();
return 0;
}