Pagini recente » Cod sursa (job #2190670) | Cod sursa (job #1865906) | Cod sursa (job #350012) | Cod sursa (job #374458) | Cod sursa (job #1025739)
#include <fstream>
#include <vector>
#include <stack>
#include <algorithm>
#include <queue>
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
int viz[100008], n, m ;
stack<int>S ;
vector <int> M[100008], ciclu ;
void citire();
int grade_pare() ;
int conex () ;
void rezolvare();
void afisare();
int main()
{
citire();
if ( grade_pare() && conex() )
{
rezolvare();
afisare();
}
else
fout << -1 << '\n' ;
return 0 ;
}
void citire()
{
int i, x, y;
fin >> n >> m ;
for ( i = 1 ; i <= m ; i++)
{
fin >> x >> y ;
M[x].push_back(y);
M[y].push_back(x);
}
}
int grade_pare()
{
int i ;
for ( i = 1 ; i <= n ; i++)
if ( M[i].size() % 2 != 0 )
return 0;
return 1 ;
}
int conex()
{
int i, x;
queue <int> q ;
q.push(1) ; viz[1] = 1;
while ( ! q.empty() )
{
x = q.front();
q.pop();
for ( i = 0 ; i < M[x].size() ; i++)
{
if ( viz[M[x][i]] == 0 )
{
viz[M[x][i]] = 1 ;
q.push(M[x][i]) ;
}
}
}
for ( i = 1 ; i <= n ; i++)
if ( viz[i] == 0 )
return 0;
return 1 ;
}
void rezolvare()
{
int x,y, j;
S.push(1) ;
while ( ! S.empty() )
{
x = S.top();
if ( M[x].size() > 0 )
{
y = M[x].back();
S.push(y);
M[x].pop_back();
for ( j = 0 ; j < M[y].size(); j++)
if ( M[y][j] == x )
{
M[y].erase(M[y].begin() + j );
break ;
}
}
else
{
ciclu.push_back(x);
S.pop();
}
}
}
void afisare()
{
int i ;
for ( i = 0 ; i < ciclu.size() - 1 ; i++ )
fout << ciclu[i] << " " ;
fout << '\n' ;
}