Pagini recente » Cod sursa (job #1588527) | Cod sursa (job #2987894) | Cod sursa (job #2862713) | Cod sursa (job #2973389) | Cod sursa (job #953751)
Cod sursa(job #953751)
#include <fstream>
#include <vector>
#include <queue>
#include <stack>
#include <list>
#define maxn 100010
using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
vector <int> A[maxn];
int grad[maxn],viz[maxn],n,m;
queue <int> coada;
stack <int> stiva;
list <int> lista;
void bfs(int nod)
{
coada.push(nod);
viz[nod] = 1;
while (!coada.empty())
{
nod = coada.front();
coada.pop();
for (unsigned int i=0;i<A[nod].size();i++)
if (viz[A[nod][i]] == 0)
{
coada.push(A[nod][i]);
viz[A[nod][i]] = 1;
}
}
}
bool este_conex()
{
bfs(1);
for (int i=1;i<=n;i++)
if (viz[i]==0)
return false;
return true;
}
bool eulerian()
{
if (este_conex())
{
for (int i=1;i<=n;i++)
if (grad[i]%2!=0)
return false;
return true;
}
else
return false;
}
void sterge(int a, int b)
{
vector <int>::iterator it;
grad[a]--;
grad[b]--;
for (it=A[a].begin();it<A[a].end();it++)
if (*it == b && !A[a].empty())
{
A[a].erase(it);
break;
}
for (it=A[b].begin();it<A[b].end();it++)
if (*it == a && !A[b].empty())
{
A[b].erase(it);
break;
}
}
void ciclu(int v)
{
while (true)
{
if (A[v].empty())
break;
int w = A[v].front();
stiva.push(v);
sterge(v,w);
v=w;
}
}
int rezolvare()
{
int i=1;
if (!eulerian())
return -1;
do
{
ciclu(i);
i = stiva.top();
stiva.pop();
lista.push_back(i);
} while (!stiva.empty());
return 1;
}
int main()
{
int i,a,b;
f >> n >> m;
for (i=0;i<m;i++)
{
f >> a >> b;
A[a].push_back(b);grad[a]++;
A[b].push_back(a);grad[b]++;
}
if (rezolvare()==-1)
g << -1 ;
else
{
list<int>::iterator it;
for (it=lista.begin();it!=lista.end();it++)
g << *it << " ";
}
return 0;
}