Pagini recente » Borderou de evaluare (job #136202) | Autentificare | Cod sursa (job #1680583) | Cod sursa (job #2863668) | Cod sursa (job #3214048)
#include <iostream>
#include <fstream>
#include <vector>
#define MAXN 100000
#define MAXM 500000
#define DEBUG 0
using namespace std;
struct Edge{
int a, b;
};
vector<vector<int>> v;
vector<int> path;
vector<Edge> edges;
int n;
int rep[MAXN];
void hierholzer(int id){
if(DEBUG){
printf("Node: %d\n", id + 1);
for(int j = 0; j < n; j ++){
printf("%d: ", j + 1);
if(!v[j].empty()){
for(int i = 0; i < v[j].size(); i ++){
if(edges[v[j][i]].a != -1)
printf("(%d, %d) ", edges[v[j][i]].a + 1, edges[v[j][i]].b + 1);
}
}
printf("\n");
}
printf("\n");
fflush(NULL);
}
while(!v[id].empty()) {
int eid = v[id][v[id].size() - 1];
if(edges[eid].a != -1){
int other;
if(edges[eid].b == id)
other = edges[eid].a;
else
other = edges[eid].b;
edges[eid] = {-1, -1};
hierholzer(other);
}
if(!v[id].empty())
v[id].pop_back();
}
path.push_back(id);
}
int main(){
int m;
ifstream fin ("euler.in");
fin >> n >> m;
v.resize(n);
for(int i = 0; i < m; i ++){
int a, b;
fin >> a >> b;
a --;
b --;
if(a != b){
v[a].push_back(edges.size());
v[b].push_back(edges.size());
edges.push_back({a, b});
} else
rep[a] ++;
}
fin.close();
int nr = 0, last = 0;
for(int i = 0; i < n; i ++){
if(v[i].size() % 2 == 1){
nr ++;
last = i;
}
}
ofstream fout ("euler.out");
if(nr > 2){
fout << "-1" << endl;
fout.close();
return 0;
}
hierholzer(last);
for(int i = path.size() - 1; i > 0; i --){
while(rep[path[i]] > 0){
fout << path[i] + 1 << ' ';
rep[path[i]] --;
}
fout << path[i] + 1 << ' ';
}
fout.close();
return 0;
}