Pagini recente » Cod sursa (job #1869028) | Cod sursa (job #2240352) | Cod sursa (job #1595051) | Cod sursa (job #1069820) | Cod sursa (job #1379488)
#include <cstdio>
#include <stack>
#include <vector>
#include <queue>
using namespace std;
#define MAXM 500005
#define MAXN 100005
struct muchie
{
int a, b;
bool ex;
};
vector<int> v[MAXN], sol;
stack<int> st;
muchie muc[MAXM];
int n, m, vec[MAXN];
bool viz[MAXN];
void eul(int sursa);
bool isEul();
int main()
{
freopen("ciclueuler.in", "r", stdin);
freopen("ciclueuler.out", "w", stdout);
int i, a, b;
scanf("%d%d", &n, &m);
for(i=1; i<=m; i++)
{
scanf("%d%d", &a, &b);
v[a].push_back(i);
v[b].push_back(i);
muc[i].a = a; muc[i].b = b; muc[i].ex = 1;
vec[a]++; vec[b]++;
}
if(!isEul())
{
printf("-1");
return 0;
}
eul(1);
vector<int>::iterator it;
for(int i=0; i<=sol.size()-2; i++)
printf("%d ", sol[i]);
return 0;
}
void eul(int sursa)
{
int tata, fiu;
vector<int>::iterator it;
st.push(sursa);
while(!st.empty())
{
tata = st.top();
if(!vec[tata])
{
sol.push_back(tata);
st.pop();
continue;
}
for(it=v[tata].begin(); it!=v[tata].end(); ++it)
{
if(muc[*it].ex)
{
if(muc[*it].a == tata)
fiu = muc[*it].b;
else
fiu = muc[*it].a;
muc[*it].ex = 0;
st.push(fiu);
vec[tata]--; vec[fiu]--;
break;
}
}
}
}
void bfs(int nod)
{
int tata;
queue<int> q;
vector<int>::iterator it;
q.push(nod);
while(!q.empty())
{
tata = q.front();
q.pop();
for(it=v[tata].begin(); it!=v[tata].end(); ++it)
if(!viz[*it])
{
viz[*it] = 1;
q.push(*it);
}
}
}
bool isEul()
{
int i, fiu;
vector<int>::iterator it;
for(i=1; i<=n; i++)
if(v[i].size() % 2)
return 0;
bfs(1);
for(i=1; i<=n; i++)
if(!viz[i])
return 0;
return 1;
}