Pagini recente » Cod sursa (job #2070465) | Cod sursa (job #25965) | Cod sursa (job #62667) | Cod sursa (job #2189674) | Cod sursa (job #2491502)
#include <bits/stdc++.h>
using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
const int N=100010;
const int M=500010;
int n,m,k,cnt,c[N],viz[M],a[M],b[M];
vector<int>v[N];
bitset<N>used;
void dfs(int),sorteaza(vector<int>&),solve(int);
int main()
{
f>>n>>m;
for(;m;m--)
{
int x,y;
f>>x>>y;
if(x==y)
{
c[x]++;
}
else
{
a[++k]=x;
b[k]=y;
v[x].push_back(k);
v[y].push_back(k);
}
}
for(int i=1;i<=n;i++)
if(v[i].size()%2)
{
g<<"-1";
return 0;
}
dfs(1);
if(cnt<n)
{
g<<"-1";
return 0;
}
for(int i=1;i<=n;i++)
{
sorteaza(v[i]);
}
solve(1);
return 0;
}
void dfs(int nod)
{
used[nod]=1;
cnt++;
for(auto it:v[nod])
{
int vec=a[it]+b[it]-nod;
if(!used[vec])
{
dfs(vec);
viz[it]=1;
}
}
}
void solve(int nod)
{
for(int i=c[nod];i;i--)
g<<nod<<' ';
c[nod]=0;
while(v[nod].size()&&viz[v[nod].back()]==2)
v[nod].pop_back();
if(v[nod].size()==0)
exit(0);
g<<nod<<' ';
int e=v[nod].back();
viz[e]=2;
nod=a[e]+b[e]-nod;
solve(nod);
}
void sorteaza(vector<int> &u)
{
int st=0;
int dr=u.size()-1;
while(st<dr)
{
if(viz[u[st]]==1)
st++;
else
if(viz[u[dr]]==0)
dr--;
else
{
swap(u[st],u[dr]);
st++;
dr--;
}
}
}