Pagini recente » Cod sursa (job #274719) | Cod sursa (job #862266) | Cod sursa (job #1418799) | Cod sursa (job #2949083) | Cod sursa (job #1384496)
#include <fstream>
#include <vector>
#include <stack>
#include <bitset>
#define nmax 100005
using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
vector <pair <int,int> > v[nmax];
stack <int> s;
bitset <nmax*5> uz;
int n,m,grad[nmax],st,nod;
void dfs(int nod)
{
int i;
uz[nod]=1;
for (i=0;i<v[nod].size();i++) {
if (uz[v[nod][i].first]==0) {
dfs(v[nod][i].first);
}
}
}
int main()
{
int i,j,x,y,siz;
f>>n>>m;
for (i=1;i<=m;i++) {
f>>x>>y;
v[x].push_back(make_pair(y,i));
v[y].push_back(make_pair(x,i));
grad[x]++;
grad[y]++;
}
for (i=1;i<=n;i++) {
st=i;
dfs(i);
break;
}
for (i=1;i<=n;i++)
if ((uz[i]==0&&grad[i]!=0)||(grad[i]%2==1)) {
g<<-1<<'\n';
return 0;
}
uz.reset();
s.push(st);
int first=1;
while (!s.empty()) {
nod=s.top();
if (grad[nod]==0) {
if (!first) {
g<<nod<<' ';
}
first=0;
s.pop();
continue;
}
while (uz[v[nod][v[nod].size()-1].second]==1)
v[nod].erase(v[nod].end()-1);
siz=v[nod].size();
uz[v[nod][siz-1].second]=1;
s.push(v[nod][siz-1].first);
grad[nod]--;
grad[v[nod][siz-1].first]--;
v[nod].erase(v[nod].end()-1);
}
return 0;
}