Pagini recente » Cod sursa (job #137930) | Cod sursa (job #1932691) | Monitorul de evaluare | Cod sursa (job #1657004) | Cod sursa (job #754325)
Cod sursa(job #754325)
#include <fstream>
#include <set>
#include <vector>
#include <queue>
using namespace std;
int grad[100001];
int From[500005];
int To[500005];
int Taken[500005];
int ciclu[500005];
int cpos;
vector<int> *Nod;
int StNod[500001];
int SNP;
int StMuch[500001];
int SMP;
int main(void)
{
fstream fin("ciclueuler.in",ios::in);
fstream fout("ciclueuler.out",ios::out);
long Noduri,Muchii,i,a,b;
fin >> Noduri >> Muchii;
Nod = new vector<int>[100001];
for (i = 0;i < Muchii;i += 1)
{
fin >> a >> b;
From[i] = a;
To[i] = b;
grad[a] += 1;
grad[b] += 1;
Nod[a].push_back(i);
Nod[b].push_back(i);
}
for (i = 1;i <= Noduri;i += 1)
{
if (grad[i] & 1)
{
fout << "-1";
fin.close();
fout.close();
return 0;
}
}
cpos = 0;
SNP = 0;
SMP = 0;
StNod[SNP] = 1;
StMuch[SMP] = 0;
while (SNP >= 0)
{
while (StMuch[SMP] < Nod[StNod[SNP]].size())
{
int muchi = StMuch[SMP];
int nod = StNod[SNP];
StMuch[SMP] += 1;
if (Taken[Nod[nod][muchi]])
{
continue;
}
if (From[Nod[nod][muchi]] == nod)
{
Taken[Nod[nod][muchi]] = 1;
SNP += 1;
StNod[SNP] = To[Nod[nod][muchi]];
SMP += 1;
StMuch[SMP] = 0;
}
else
{
Taken[Nod[nod][muchi]] = 1;
SNP += 1;
StNod[SNP] = From[Nod[nod][muchi]];
SMP += 1;
StMuch[SMP] = 0;
}
Nod[nod].erase(Nod[nod].begin() + muchi);
}
ciclu[cpos] = StNod[SNP];
cpos += 1;
SNP -= 1;
SMP -= 1;
}
for (cpos -= 1;cpos > 0;cpos -= 1)
{
fout << ciclu[cpos] << " ";
}
fin.close();
fout.close();
return 0;
}