Pagini recente » Cod sursa (job #395685) | Cod sursa (job #2391174) | Cod sursa (job #950138) | Cod sursa (job #2837596) | Cod sursa (job #1322421)
#include <cstdio>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;
vector <int> L[100001];
int viz[100001];
int n,m;
vector<int> ciclu;
stack<int> S;
void citire()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
L[x].push_back(y);
L[y].push_back(x);
}
}
int grade_pare()
{
for(int i=1;i<=n;i++)
if(L[i].size()%2==1)
return 0;
return 1;
}
void DFS(int i)
{
//printf("%d ",i);
viz[i]=1;
for(vector <int>::iterator it=L[i].begin();it!=L[i].end();it++)
if(!viz[*it])
DFS(*it);
}
int conex()
{
DFS(1);
for(int i=1;i<=n ;i++)
if(!viz[i]) return 0;
return 1;
}
/*euler (nod v)
cat timp (v are vecini)
w = un vecin aleator al lui v
sterge_muchie (v, w)
euler (w)
sfarsit cat timp
adauga v la ciclu
*/
void det_ciclu()
{
S.push(1);
while(!S.empty())
{
int v=S.top();
if(L[v].size())
{
int k=L[v].back();
L[v].pop_back();
S.push(k);
vector<int> ::iterator it;
it=find(L[k].begin(),L[k].end(),v);
L[k].erase(it);
}
else
{
S.pop();
ciclu.push_back(v);
}
}
}
int main()
{
freopen("ciclueuler.in","r",stdin);
freopen("ciclueuler.out","w",stdout);
citire();
if(!grade_pare() ||! conex())printf("-1");
else
//printf("da");
{
det_ciclu();
for(vector<int>::iterator it=ciclu.begin();it!=ciclu.end()-1;it++)
printf("%d ", *it);
}
return 0;
}