Pagini recente » Cod sursa (job #2440615) | Cod sursa (job #1788483) | Cod sursa (job #10884) | Cod sursa (job #2934703) | Cod sursa (job #3214068)
#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 = false;
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 degrees[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, n;
ifstream fin ("ciclueuler.in");
fin >> n >> m;
v.resize(n);
nre = 0;
for(int i = 0; i < m; i ++){
int a, b;
fin >> a >> b;
a --;
b --;
v[a].push_back(nre);
v[b].push_back(nre);
edges[nre] = {a, b};
nre ++;
if(a != b){
degrees[a] ++;
degrees[b] ++;
}
}
fin.close();
int nr = 0;
for(int i = 0; i < n; i ++)
nr += (degrees[i] % 2 == 1);
ofstream fout ("ciclueuler.out");
if(nr != 0){
fout << "-1" << endl;
fout.close();
return 0;
}
pathn = 0;
euler(0);
for(int i = pathn - 1; i > 0; i --)
fout << path[i] + 1 << ' ';
fout.close();
return 0;
}