Pagini recente » Cod sursa (job #1325196) | Cod sursa (job #3239181) | Cod sursa (job #1346113) | Cod sursa (job #2843398) | Cod sursa (job #1342043)
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
#include <queue>
#define N 100004
using namespace std;
vector <int>a[N];
stack <int> st;
queue <int> q;
int n,m;
int v[N],g[N];
void Read()
{
ifstream fin("ciclueuler.in");
fin>>n>>m;
int i,x,y;
for(i=1; i<=m; i++)
{
fin>>x>>y;
a[x].push_back(y);
a[y].push_back(x);
g[x]++;
g[y]++;
}
fin.close();
}
void DFS(int k)
{
v[k]=1;
for(int i=0; i<a[k].size(); i++)
if(!v[a[k][i]])
DFS(a[k][i]);
}
bool IsConex()
{
DFS(1);
int i;
for(i=1; i<=n; i++)
if(!v[i]) return 0;
return 1;
}
bool Grad()
{
for(int i=1; i<=n; i++)
if(g[i]%2) return 0;
return 1;
}
void Euler()
{
st.push(1);
int i,j,k;
while(!st.empty())
{
k=st.top();
while(a[k].size()>0)
{
i=a[k][0];
swap(a[k][0],a[k][a[k].size()-1]);
a[k].pop_back();
for(j=0; j<a[i].size() && a[i][j]!=k; j++) ;
swap(a[i][j],a[i][a[i].size()-1]);
a[i].pop_back();
st.push(i);
k=st.top();
}
if(a[k].size()<=0)
st.pop();
q.push(k);
}
}
int main()
{
ofstream fout("ciclueuler.out");
Read();
int x;
if( IsConex() && Grad() )
{
Euler();
while(!q.empty())
{
x=q.front();
fout<<x<<" ";
q.pop();
}
fout<<"\n";
}
else fout<<"-1\n";
fout.close();
return 0;
}