Pagini recente » Cod sursa (job #351183) | Cod sursa (job #224338) | Cod sursa (job #871626) | Cod sursa (job #42359) | Cod sursa (job #3214052)
#include <iostream>
#include <fstream>
#include <vector>
#define MAXN 100000
#define MAXM 500000
#define DEBUG 0
using namespace std;
struct Edge{
int a, b;
bool deleted;
public:
int getOther(int x){
if(x == a)
return b;
return a;
}
};
vector<vector<int>> v;
vector<int> path;
vector<Edge> edges;
int n;
int rep[MAXN];
void euler(int id){
while(v[id].size() > 0) {
Edge* next = &edges[v[id][v[id].size() - 1]];
v[id].pop_back();
if(!next->deleted){
next->deleted = true;
int other = next->getOther(id);
euler(other);
}
}
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;
for(int i = 0; i < n; i ++)
nr += v[i].size() % 2 == 1;
ofstream fout ("euler.out");
if(nr != 0){
fout << "-1" << endl;
fout.close();
return 0;
}
euler(0);
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;
}