Pagini recente » Cod sursa (job #145869) | Cod sursa (job #1875531) | Cod sursa (job #2572666) | Cod sursa (job #2596520) | Cod sursa (job #2136789)
#include<cstdio>
#include<stack>
#include<vector>
#define MAX_N 100000
using namespace std;
struct node {
int val;
node* next;
};
FILE *fout = fopen("ciclueuler.out","w");
node* g[MAX_N + 1];
stack<int>st;
vector<int>cycle;
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 = g[x];
node* q;
if(p->val == y) {
q = p;
g[x] = g[x]->next;
delete q;
} else {
while(p->next->val != y)
p = p->next;
q = p->next;
p->next = p->next->next;
delete q;
}
return g[x];
}
void findEulerianCycle(int p) {
int s, Node, v;
st.push(p);
while(!st.empty()) {
Node = st.top();
if(g[Node]) {
v = g[Node]->val;
g[Node] = deleteEdge(Node,v);
g[v] = deleteEdge(v,Node);
st.push(v);
} else {
s = st.top();
cycle.push_back(s);
st.pop();
}
}
}
void printCycle() {
int size = cycle.size();
for(int i = 0; i < size - 1; i++)
fprintf(fout,"%d ",cycle[i]);
fprintf(fout,"\n");
}
int main() {
readGraph();
if(isEulerian()) {
findEulerianCycle(1);
printCycle();
} else {
fprintf(fout,"-1\n");
}
fclose(fout);
return 0;
}