Pagini recente » Cod sursa (job #571653) | Cod sursa (job #426670) | Rating Marinescu Alexandru (AlexMari) | Cod sursa (job #761917)
Cod sursa(job #761917)
#include <fstream>
#include <list>
#include <stack>
#include <queue>
#define MAX 100050
using namespace std;
list<int> E[MAX][11], L;
queue<int> Q;
stack<int> S;
int grad[MAX], n, m;
bool visited[MAX];
void citire()
{
ifstream in("ciclueuler.in");
in>>n>>m;
int a, b;
while(m--)
{
in>>a>>b;
E[a][b / 10].push_back(b);
grad[a]++;
E[b][a / 10].push_back(a);
grad[b]++;
}
in.close();
}
void bfs(int nod)
{
Q.push(nod);
while(!Q.empty())
{
int v = Q.front();
Q.pop();
for(int i = 0; i <= 10; i++)
{
for(list<int>::iterator it = E[v][i].begin(); it != E[v][i].end(); it++)
if(!visited[*it])
{
visited[*it] = true;
Q.push(*it);
}
}
}
}
bool isEulerian()
{
visited[1] = true;
bfs(1);
for(int i = 1; i <= n; i++)
if(!visited[i] || (grad[i] & 1))
return false;
return true;
}
void sterge(int v, int w)
{
grad[v]--;
grad[w]--;
E[v][w / 10].pop_front();
for(list<int>::iterator it = E[w][v / 10].begin(); it != E[w][v / 10].end(); it++)
if((*it) == v)
{
E[w][v / 10].erase(it);
return;
}
}
int isEmpty(list<int> W[])
{
for(int i = 0; i <= 10; i++)
if(!W[i].empty())
return i;
return -1;
}
void euler(int nod)
{
int a;
while((a = isEmpty(E[nod])) != -1)
{
int v = E[nod][a].front();
S.push(nod);
sterge(nod, v);
nod = v;
}
}
int solve()
{
if(!isEulerian())
return -1;
else
{
int v = 1;
do
{
euler(v);
v = S.top();
S.pop();
L.push_back(v);
}
while(!S.empty());
return 10;
}
}
void afisare(int ok)
{
ofstream out("ciclueuler.out");
if(ok == -1)
out<<"-1";
else
{
for(list<int>::iterator it = L.begin(); it != L.end(); it++)
out<<(*it)<<" ";
}
out.close();
}
int main()
{
citire();
afisare(solve());
return 0;
}