Pagini recente » Cod sursa (job #1329830) | Cod sursa (job #2482534) | Cod sursa (job #879865) | Cod sursa (job #2931020) | Cod sursa (job #2112547)
#include<cstdio>
#include<vector>
#include<stack>
#define MAX_N 100000
using namespace std;
vector<int>g[MAX_N + 1], sol;
stack<int>st;
int degree[MAX_N + 1], n, m;
void readGraph() {
int x, y;
FILE *fin = fopen("ciclueuler.in","r");
fscanf(fin,"%d%d",&n,&m);
for(int i = 0; i < m; i++) {
fscanf(fin,"%d%d",&x,&y);
g[x].push_back(y);
g[y].push_back(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;
}
void Euler(int u) {
vector<int>::iterator it;
int v;
st.push(u);
while(!st.empty()) {
u = st.top();
if(g[u].size() > 0) {
v = g[u].front();
g[u].erase(g[u].begin());
for(it = g[v].begin(); it != g[v].end() && (*it) != u; it++);
g[v].erase(it);
st.push(v);
} else {
st.pop();
sol.push_back(u);
}
}
}
void printCycle() {
int k;
FILE *fout = fopen("ciclueuler.out","w");
if(isEulerian()) {
Euler(1);
k = sol.size();
for(int i = 0; i < k - 1; i++)
fprintf(fout,"%d ",sol[i]);
fprintf(fout,"\n");
} else fprintf(fout,"-1\n");
fclose(fout);
}
int main() {
readGraph();
printCycle();
return 0;
}