Pagini recente » Cod sursa (job #719015) | Cod sursa (job #3259805) | Cod sursa (job #1074507) | Cod sursa (job #877630) | Cod sursa (job #2211988)
#include<cstdio>
#include<vector>
#include<stack>
#define MAX_N 100000
using namespace std;
struct node {
int val;
node* next;
};
FILE* fout = fopen("ciclueuler.out","w");
node* g[MAX_N+1];
vector<int>sol;
stack<int>st;
int degree[MAX_N+1], n, m;
inline void insertEdge(int x, int y) {
node* elem = new node;
elem->val = y;
elem->next = g[x];
g[x] = elem;
}
void readGraph() {
int i, x, y;
FILE* fin = fopen("ciclueuler.in","r");
fscanf(fin,"%d%d",&n,&m);
for(i = 0; i < m; i++) {
fscanf(fin,"%d%d",&x,&y);
insertEdge(x,y);
insertEdge(y,x);
degree[x]++;
degree[y]++;
}
fclose(fin);
}
bool isEulerian() {
bool ok = true;
for(int i = 1; i <= n && ok; i++)
if(degree[i] & 1)
ok = false;
return ok;
}
node* deleteEdge(int x, int y) {
node* p, *q;
if(g[x]->val == y) {
p = g[x];
g[x] = g[x]->next;
delete p;
} else {
p = g[x];
while(p->next->val != y)
p = p->next;
q = p->next;
p->next = p->next->next;
delete q;
}
return g[x];
}
void findEulerianCycle(int u) {
int v, x;
st.push(u);
while(!st.empty()) {
v = st.top();
if(g[v]) {
x = g[v]->val;
g[v] = deleteEdge(v,x);
g[x] = deleteEdge(x,v);
st.push(x);
} else {
sol.push_back(st.top());
st.pop();
}
}
}
void printCycle() {
int i, k;
k = sol.size();
for(i = 0; i < k - 1; i++)
fprintf(fout,"%d ",sol[i]);
fprintf(fout,"\n");
}
int main() {
readGraph();
if(isEulerian()) {
findEulerianCycle(1);
printCycle();
} else fprintf(fout,"-1\n");
fclose(fout);
return 0;
}