Pagini recente » Cod sursa (job #1194515) | Cod sursa (job #1428761) | Cod sursa (job #3005099) | Cod sursa (job #1223678) | Cod sursa (job #3214060)
#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;
int path[MAXM], pathn;
Edge edges[MAXN];
int nre;
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[pathn ++] = id;
}
int main(){
int m;
ifstream fin ("euler.in");
fin >> n >> m;
v.resize(n);
for(int i = 0; i < n; i ++)
rep[i] = 0;
nre = 0;
for(int i = 0; i < m; i ++){
int a, b;
fin >> a >> b;
a --;
b --;
if(a != b){
v[a].push_back(nre);
v[b].push_back(nre);
edges[nre ++] = {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;
}
pathn = 0;
euler(0);
for(int i = pathn - 1; i > 0; i --){
while(rep[path[i]] > 0){
fout << path[i] + 1 << ' ';
rep[path[i]] --;
}
fout << path[i] + 1 << ' ';
}
fout.close();
return 0;
}