Pagini recente » Cod sursa (job #726617) | Cod sursa (job #1965967) | Cod sursa (job #716872) | Cod sursa (job #708307) | Cod sursa (job #1379672)
#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();
while(v[tata].size())
{
if(muc[v[tata].back()].ex)
break;
v[tata].pop_back();
}
if(v[tata].empty())
{
sol.push_back(tata);
st.pop();
}
else{
int n1 = muc[v[tata].back()].a;
int n2 = muc[v[tata].back()].b;
if(tata == n1)
fiu = n2;
else
fiu = n1;
st.push(fiu);
muc[v[tata].back()].ex = 0;
v[tata].pop_back();
}
}
}
void bfs(int nod)
{
int tata, fiu;
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)
{
int n1 = muc[v[tata].back()].a;
int n2 = muc[v[tata].back()].b;
if(tata == n1)
fiu = n2;
else
fiu = n1;
if(!viz[fiu])
{
q.push(fiu);
viz[fiu] = 1;
}
}
}
}
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=2; i<=n; i++)
if(!viz[i])
return 0;
return 1;
}