Pagini recente » Cod sursa (job #839396) | Monitorul de evaluare | Cod sursa (job #2884035) | Cod sursa (job #521791) | Cod sursa (job #3338003)
#include <iostream>
#include <fstream>
#include <vector>
#include <stack>
#include <queue>
using namespace std;
//ifstream fin("ciclueuler.in");
//ofstream fout("ciclueuler.out");
int n,m;
int x,y;
vector<vector<pair<int,int>>>v;
vector<int>sol;
bool ciclue_eurlerian()
{
for(int i=1;i<=n;i++)
if(v[i].size()%2==1)
return 0;
queue<int>q;
vector<bool>seen;
seen.resize(n+1,0);
q.push(1);
while(!q.empty())
{
int a=q.front();
q.pop();
for(auto i:v[a])
{
if(seen[i.first]==0)
{
q.push(i.first);
seen[i.first]=1;
}
}
}
for(int i=1;i<=n;i++)
if(seen[i]==0)
return 0;
vector<int>drum;
stack<int>st;
st.push(1);
vector<bool>used;
used.resize(m+1,0);
while(!st.empty())
{
int a=st.top();
bool ok=0;
int id;
int nod_vecin;
for(auto i:v[a])
{
if(used[i.second]==0)
{
ok=1;
id=i.second;
nod_vecin=i.first;
break;
}
}
if(ok)
{
st.push(nod_vecin);
used[id]=1;
}
else
{
st.pop();
drum.push_back(a);
}
}
sol=drum;
return 1;
}
#define fin cin
#define fout cout
int main()
{
freopen("ciclueuler.in","r",stdin);
freopen("ciclueuler.out","w",stdout);
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
fin>>n>>m;
v.resize(n+1);
for(int i=1;i<=m;i++)
{
fin>>x>>y;
v[x].push_back({y,i});
v[y].push_back({x,i});
}
if(ciclue_eurlerian())
for(int i=0;i<sol.size()-1;i++)
fout<<sol[i]<<" ";
else
fout<<-1;
return 0;
}