Pagini recente » Cod sursa (job #2265478) | Cod sursa (job #410581) | Cod sursa (job #2238726) | Cod sursa (job #3131275) | Cod sursa (job #649770)
Cod sursa(job #649770)
#include<cstdio>
#include<vector>
#include<algorithm>
#include<stack>
using namespace std;
vector <vector <int> > edges;
vector <int> degree;
stack <int> st;
int V, E;
int main(){
freopen("ciclueuler.in", "r", stdin), freopen("ciclueuler.out", "w", stdout);
int x, y, i;
scanf("%d %d", &V, &E);
vector <int> nullVector;
edges.assign(V + 1, nullVector);
degree.assign(V + 1, 0);
for (i = 0; i < E; i++){
scanf("%d %d", &x, &y);
edges[x].push_back(y), edges[y].push_back(x);
degree[x]++, degree[y]++;
}
//verifica daca este eulerian
for (i = 1; i <= V; i++)
if (degree[i] % 2 == 1) {printf ("-1\n"); return 0;}
//construieste ciclul
for (i = 1; i <= V && degree[i] == 0; i++);
st.push(i);
E = E * 2;
int n = 0;
while (E){
x = st.top();
if (degree[x] == 0) { st.pop(); n--; }
if (edges[x].size()){
int y = edges[x][0];
st.push(y);
n++;
edges[x].erase(edges[x].begin());
edges[y].erase(find(edges[y].begin(), edges[y].end(), x));
degree[x]--, degree[y]--;
E-=2;
}
}
int nr;
int a = st.top();
for (nr = 0; !st.empty(); nr++, st.pop()) {
if(nr == n && a == st.top()) continue;
printf("%d ", st.top());
}
//printf("\n%d", nr - 1);
return 0;
}