Pagini recente » Cod sursa (job #1893201) | Cod sursa (job #1238478) | Cod sursa (job #1205643) | Cod sursa (job #2925409) | Cod sursa (job #3339786)
#include <fstream>
#include <vector>
#define NMAX 100002
#define MMAX 500002
using namespace std;
ifstream fin ("ciclueuler.in");
ofstream fout ("ciclueuler.out");
struct muchie {int x, nr;};
int n, m;
vector<muchie>G[NMAX];
vector<int> C;
bool sters[MMAX];
void citire();
void euler(int x);
bool okgrade();
int main()
{
int i;
citire();
if(!okgrade())
{
fout<<-1<<'\n';
return 0;
}
for(i = 1; i <= n; i++)
if(G[i].size()) //primul nod neizolat
{
euler(i);
break; //oricum ma intereseaza doar o comp conexa (daca are mai multe nu este eulerian)
}
if(C.size() != m + 1)
{
fout<<-1<<'\n';
return 0;
}
for(i = 0; i < C.size() - 1; i++)
fout<<C[i]<<' ';
fout<<'\n';
return 0;
}
void citire()
{
int i, x, y;
fin>>n>>m;
for(i = 1; i <= m; i++)
{
fin>>x>>y;
G[x].push_back({y, i});
G[y].push_back({x, i});
}
}
bool okgrade()
{
int i;
for(i = 1; i <= n; i++)
if(G[i].size() % 2)
{
return 0;
}
return 1;
}
void euler(int x)
{
muchie m;
while(G[x].size()) //cat timp mai are vecini
{
m = G[x].back(); G[x].pop_back();
if(!sters[m.nr])
{
sters[m.nr] = 1;
euler(m.x);
}
}
C.push_back(x);
}