Pagini recente » Cod sursa (job #407168) | Cod sursa (job #57880) | Cod sursa (job #3199035) | Cod sursa (job #1659166) | Cod sursa (job #1199841)
#include<fstream>
#include<vector>
#include<bitset>
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
const int NMAX=100005;
const int MMAX=500005;
int n,m,st[MMAX],dr[MMAX],ciclu[MMAX];
vector<int>graf[NMAX];
bitset<MMAX>viz;
//st[i]=capatul stang al muchiei i
//dr[i]=capatul drept al muchiei i
inline void Citire()
{
int i;
fin>>n>>m;
for (i=1;i<=m;i++)
{
fin>>st[i]>>dr[i];
graf[st[i]].push_back(i);
graf[dr[i]].push_back(i);
}
}
inline void Con(int x)
{
int i,len;
viz[x]=1;
len=graf[x].size();
for (i=0;i<len;i++)
if (!viz[st[graf[x][i]]+dr[graf[x][i]]-x])
Con(st[graf[x][i]]+dr[graf[x][i]]-x);//ma duc in celalalt capat al muchiei
}
inline bool Conexitate()
{
Con(1);
int i;
for (i=1;i<=n;i++)
if (!viz[i]) return 0;
return 1;
}
inline bool EsteEulerian()
{
int i;
for (i=1;i<=n;i++)
if (graf[i].size()&1) return 0;
return 1;
}
inline void DFS(int x)
{
int i,len;
len=graf[x].size();
for (i=0;i<len;i++)
if (!viz[graf[x][i]])//daca muchia prezenta nu este vizitata
{
viz[graf[x][i]]=1;//o vizitam
DFS(st[graf[x][i]] + dr[graf[x][i]]-x);//mergem in celalalt capat al muchiei
}
ciclu[++ciclu[0]]=x;
}
int main()
{
Citire();
if (Conexitate() && EsteEulerian())
{
for (int i=1;i<=MMAX;i++) viz[i]=0;
DFS(1);
for (int i=1;i<=ciclu[0];i++) fout<<ciclu[i]<<" ";
}
else fout<<"-1";
fout<<"\n";
return 0;
}