Pagini recente » Cod sursa (job #357218) | Cod sursa (job #1241008) | Arhiva de probleme | Cod sursa (job #1043923) | Cod sursa (job #1194013)
#include <fstream>
#include <bitset>
#include <vector>
#include <cstdlib>
#define N 100001
using namespace std;
int r[500001];
const int mod=7013;
bitset<N>v1[N];
vector <int>nd[N];
struct nr
{
int x,y,val;
};
vector <nr> X[mod];
vector <nr>::iterator it1;
inline void adauga(int x,int y)
{
for(it1=X[x%mod].begin();it1!=X[x%mod].end();it1++)
{
if(it1->x==x&&it1->y==y) {it1->val++;return;}
}
nr pas;
pas.x=x;pas.y=y;pas.val=1;
X[x%mod].push_back(pas);
}
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
inline void afisare(int nr)
{
for(int i=1;i<=nr;i++) fout<<r[i]<<" ";
exit(0) ;
}
inline bool fid(int nod,int it)
{
int zum=nod%mod;
for(it1=X[zum].begin();it1!=X[zum].end();it1++)
{
if(it1->x==nod&&it1->y==it&&it1->val!=0) return 1;
}
return 0;
}
inline void scade(int nod,int it)
{
int zum=nod%mod;
for(it1=X[zum].begin();it1!=X[zum].end();it1++)
{
if(it1->x==nod&&it1->y==it) {it1->val--;return;}
}
}
inline void euler(int i,int nod,int nr)
{
if(i<=nr)
{
for(vector <int>::iterator it=nd[nod].begin();it!=nd[nod].end();it++)
{
if(fid(nod,*it))
{
r[i]=*it;
scade(nod,*it);
if(*it!=nod) scade(*it,nod);
euler(i+1,*it,nr);
adauga(nod,*it);if(*it!=nod) adauga(*it,nod);
}
}
}
else if(v1[nod][1]&&fid(nod,1))
{
afisare(nr);
}
}
int main()
{
int n,x,y,m,i;
fin>>n>>m;
int nr=0;i=1;
while(i<=m)
{
fin>>x>>y;
nd[x].push_back(y);
nd[y].push_back(x);
nr++;
v1[x][y]=1;
adauga(x,y);
if(x!=y) adauga(y,x);
v1[y][x]=1;
i++;
}
r[1]=1;
euler(2,1,nr);
}