Pagini recente » Cod sursa (job #2843139) | Cod sursa (job #930638) | Cod sursa (job #3152348) | Cod sursa (job #1622952) | Cod sursa (job #726315)
Cod sursa(job #726315)
#include<fstream>
#include<list>
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
int i,n,m,x,y,grad[100001],aux[100001],sol[100001],nr,mare;
bool viz[100001];
bool ok;
list <int> v[100001];
inline void df(int k)
{ list<int>::iterator it;
viz[k] = true;
for (it=v[k].begin();it!=v[k].end();++it)
if (!viz[*it])
df(*it);
}
inline void dft(int k)
{ if (v[k].size())
{ list <int>::iterator it;
aux[++nr] = v[k].front();
it = v[2].begin();
v[k].pop_front();
it = v[aux[nr]].begin();
while (*it != k)
++it;
v[aux[nr]].erase(it);
dft(aux[nr]);
}
}
inline void adaug()
{int j;
for (i=1;i<=n && sol[i]!=aux[1];++i);
for (j=1;j<=mare-i+1;++j)
{ sol[mare+j] = sol[i+j-1];
sol[i+j-1] = aux[j];
}
mare = mare + nr - 1;
nr=0;
}
int main()
{ fin >> n >> m;
for (i=1;i<=m;++i)
{ fin >> x >> y;
v[x].push_back(y);
v[y].push_back(x);
++grad[x];
++grad[y];
}
df(1);
for (i=1;i<=n;++i)
if (!viz[i] && (grad[i] % 2))
{ fout << "-1";
return 0;
}
aux[++nr] = 1;
dft(1);
for (i=1;i<=nr;++i)
sol[i] = aux[i];
mare = nr;
nr=0;
while (!ok)
{ for (i=1;i<=n && !v[i].size();++i);
if (i>=n)
{ for (i=1;i<mare;++i)
fout << sol[i] << " ";
return 0;
}
aux[++nr] = i;
dft(i);
adaug();
}
return 0;
}