Pagini recente » Cod sursa (job #1052988) | Cod sursa (job #929126)
Cod sursa(job #929126)
#include <fstream>
#include <vector>
#include <stack>
#define NMAX 100001
std::ofstream out("ciclueuler.out");
std::vector <int> adjacency_list[NMAX];
void read(int &no_vertices,int &no_edges) {
std::ifstream in("ciclueuler.in");
in>>no_vertices>>no_edges;
for (int i = 0; i < no_edges; ++i) {
int a,b;
in>>a>>b;
adjacency_list[a].push_back(b);
adjacency_list[b].push_back(a);
}
}
bool IsEulerGraph(int &no_vertices) {
int degree;
for (int i = 0; i < no_vertices; ++i) {
degree = adjacency_list[i].size();
if (degree & 1) {
return false;
}
}
return true;
}
void DetermineCycle(int &no_vertices) {
std::stack <int> my_stack;
int vertex,next_vertex;
my_stack.push(1);
do {
vertex = my_stack.top();
my_stack.pop();
while (!adjacency_list[vertex].empty()) {
next_vertex = adjacency_list[vertex].back();
adjacency_list[vertex].pop_back();
for (std::vector<int>::iterator it = adjacency_list[next_vertex].begin(); it != adjacency_list[next_vertex].end(); ++it) {
if (*it == vertex) {
*it = *(adjacency_list[next_vertex].end()-1);
adjacency_list[next_vertex].pop_back();
break;
}
}
my_stack.push(vertex);
vertex = next_vertex;
}
if (!my_stack.empty())
out<<my_stack.top()<<" ";
} while (!my_stack.empty());
}
int main() {
int no_vertices,no_edges;
read(no_vertices,no_edges);
if (IsEulerGraph(no_vertices)) {
DetermineCycle(no_vertices);
} else {
out<<"-1";
}
return 0;
}