Pagini recente » Cod sursa (job #1112044) | Cod sursa (job #1724114) | Cod sursa (job #2856698) | Cod sursa (job #2078402) | Cod sursa (job #713689)
Cod sursa(job #713689)
#include<fstream>
#include<vector>
#define NMAX 100010
#define MMAX 1000010
using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
vector<int> a[NMAX];
int gr[NMAX], vz[NMAX], ciclu[MMAX], aux[MMAX], n, m;
void Citeste()
{
int x, y, i;
f>>n>>m;
for (i=1; i<=m; ++i)
{
f>>x>>y;
a[x].push_back(y); ++gr[x];
a[y].push_back(x); ++gr[y];
}
}
void DFS(int nod)
{
int i;
vz[nod]=1;
for (i=0; i<(int)a[nod].size(); ++i)
if (!vz[a[nod][i]]) DFS(a[nod][i]);
}
bool BUN()
{
int i;
DFS(1);
for (i=1; i<=n; ++i)
if (!vz[i] || gr[i]==0 || gr[i]%2==1) return 0;
return 1;
}
void Cauta(int x, int y)
{
int i;
for (i=0; i<(int)a[x].size(); ++i)
if (a[x][i]==y) {a[x][i]=0;break;}
for (i=0; i<(int)a[y].size(); ++i)
if (a[y][i]==x) {a[y][i]=0;break;}
}
void Bucatica(int x)
{
int i, pr=x;
--gr[x]; aux[0]=0;
for (i=0; i<(int)a[x].size(); ++i)
if (gr[a[x][i]])
{
x=a[x][i];
aux[++aux[0]]=x;
--gr[x];
Cauta(x, pr);
break;
}
while (gr[x]%2!=0 && gr[x])
{
--gr[x];
for (i=0; i<(int)a[x].size(); ++i)
if (gr[a[x][i]])
{
pr=x;
x=a[x][i];
Cauta(x, pr);
break;
}
aux[++aux[0]]=x; --gr[x];// pr=x;
}
}
void Copie(int pz)
{
int i, j;
for (i=ciclu[0], j=ciclu[0]+aux[0]; i>=pz; --i, --j)
ciclu[j]=ciclu[i];
for (i=pz, j=1; i<=pz+aux[0]-1; ++i, ++j) ciclu[i]=aux[j];
ciclu[0]+=aux[0];
}
void Ciclu_Euler()
{
int i;
ciclu[1]=ciclu[0]=1;
Bucatica(1);
Copie(2);
for (i=1; i<=ciclu[0]; ++i)
if (gr[ciclu[i]])
{
Bucatica(ciclu[i]);
Copie(i+1);
i=i-1;
}
g<<ciclu[1];
for (i=2; i<ciclu[0]; ++i)
g<<" "<<ciclu[i];
g<<"\n";
}
int main()
{
Citeste();
if (BUN()) Ciclu_Euler();
else g<<"-1\n";
f.close();
g.close();
return 0;
}