Pagini recente » Cod sursa (job #458465) | Cod sursa (job #2174245) | Cod sursa (job #1168650) | Cod sursa (job #2602776) | Cod sursa (job #2145772)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#define DIM 100002
using namespace std;
ifstream in ("ciclueuler.in");
ofstream out("ciclueuler.out");
int n, m, x, y;
bool viz[DIM];
vector<int> sol;
struct GRAF{
int edg;
bool viz;
};
GRAF make_graf(int edg, int viz){
GRAF x;
x.edg = edg;
x.viz = viz;
return x;
}
vector<GRAF> graf[DIM];
bool check(int nod, int nodc){
int st = 0;
int dr = graf[nod].size() - 1;
while(st <= dr){
int mid = (st + dr) / 2;
if(graf[nod][mid].edg < nodc)
st = mid + 1;
if(graf[nod][mid].edg == nodc && graf[nod][mid].viz == 1)
st = mid + 1;
if(graf[nod][mid].edg > nodc)
dr = mid - 1;
if(graf[nod][mid].edg == nodc && graf[nod][mid].viz == 0)
dr = mid - 1;
}
if(graf[nod][st].edg == nodc && graf[nod][st].viz == 0){
graf[nod][st].viz = 1;
return 1;
}
return 0;
}
void euler(int nod){
viz[nod] = 1;
// sol.push_back(nod);
for(int i = 0; i < graf[nod].size(); ++ i){
if(graf[nod][i].viz)
continue;
int nodc = graf[nod][i].edg;
graf[nod][i].viz = 1;
if(check(nodc, nod)){
euler(nodc);
}
}
sol.push_back(nod);
}
bool cmp(GRAF a, GRAF b){
return a.edg < b.edg;
}
int main(int argc, const char * argv[]) {
in>>n>>m;
for(int i = 1; i <= m; ++ i){
in>>x>>y;
graf[x].push_back(make_graf(y, 0));
graf[y].push_back(make_graf(x, 0));
}
for(int i = 1; i <= n; ++ i){
sort(graf[i].begin(), graf[i].end(), cmp);
if(graf[i].size() % 2){
out<<-1;
return 0;
}
}
euler(1);
for(int i = 1; i <= n; ++ i)
if(!viz[i]){
out<<-1;
return 0;
}
for(vector<int>::iterator it = sol.begin(); it != sol.end() - 1; ++ it)
out<<*it<<" ";
return 0;
}