Pagini recente » Cod sursa (job #1637228) | Cod sursa (job #985674) | Cod sursa (job #2844303) | Cod sursa (job #1589333) | Cod sursa (job #1325820)
#include<fstream>
#include<deque>
#include<stack>
#include<vector>
#define MAXN 100001
#define MAXM 500001
using namespace std;
typedef int var;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
struct Edge {
var n, i;
Edge(var a, var b) {
n = a;
i = b;
}
};
deque<Edge> G[MAXN];
var PARENT[MAXN];
var D[MAXN];
bool VIZ[MAXN];
bool T[MAXM];
var n;
void dfs(var node) {
VIZ[node] = 1;
for(deque<Edge>::iterator it = G[node].begin(); it != G[node].end(); ++it) {
Edge &e = *it;
if(!VIZ[e.n]) {
PARENT[e.n] = node;
T[e.i] = 1;
dfs(e.n);
}
}
}
int main() {
var m, a, b;
stack<var> ST;
fin>>n>>m;
for(var i=1; i<=m; i++) {
fin>>a>>b;
G[a].push_back(Edge(b, i));
G[b].push_back(Edge(a, i));
D[a]++;
D[b]++;
}
dfs(1); //SCOATEM ARBORELE DE REVENIRE
for(var i=1; i<=n; i++) {
if( D[i] % 2 || !VIZ[i]) {
fout<<-1;
return 0;
}
}
ST.push(1);
while(ST.top() != 0) {
var node = ST.top();
ST.pop();
while(T[G[node].front().i]) {
G[node].pop_front(); //SCOATEM VECINII CARE SUNT BAGATI PRIN MUCHII LUATE
}
if(G[node].empty()) {
ST.push(PARENT[node]); //MERGEM PE ARBORELE DE REVENIRE
} else {
ST.push(G[node].front().n); //ADAUGAM VECINUL
T[G[node].front().i] = 1; //AM LUAT MUCHIA
G[node].pop_front();
}
if(ST.top()) fout<<ST.top()<<" ";
}
return 0;
}