Pagini recente » Cod sursa (job #1517125) | Cod sursa (job #1168528) | Cod sursa (job #419249) | Cod sursa (job #2535995) | Cod sursa (job #928233)
Cod sursa(job #928233)
#include<stdio.h>
#include<vector>
#include<fstream>
using namespace std;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
#define MaxN 100100
#define MaxM 500100
int N,M;
vector<pair<int,int> > A[MaxN];
int SolV[MaxM];
int viz[MaxM],St[MaxM],StPoz[MaxM];
void citire(void)
{
int a,b;
f >> N >> M;
for(int i=1;i<=M;i++)
{
f >> a >> b;
A[a].push_back(make_pair(b,i));
A[b].push_back(make_pair(a,i));
}
}
inline void DF(int a)
{
viz[a] = 1;
for(int i=0;i<A[a].size();i++)
if(!viz[A[a][i].first])
DF(A[a][i].first);
}
inline int esteEuler(void)
{
DF(1);
for(int i=1;i<=N;i++)
if(!viz[i])
return 0;
else
viz[i] = 0;
for(int i=1;i<=N;i++)
if(A[i].size()%2)
return 0;
return 1;
}
void euler(void)
{
int k = 1;
St[k] = 1;
StPoz[k] = 0;
for(;k;StPoz[k]++)
{
if(StPoz[k] < A[St[k]].size())
{
if(!viz[A[St[k]][StPoz[k]].second])
{
viz[A[St[k]][StPoz[k]].second] = 1;
St[k+1] = A[St[k]][StPoz[k]].first;
A[St[k]][StPoz[k]] = A[St[k]].back();
A[St[k]].pop_back();
StPoz[++k] = -1;
}
}
else
{
SolV[++SolV[0]] = St[k--];
}
}
}
int main()
{
citire();
if(!esteEuler())
g << -1;
else
{
euler();
for(int i=1;i<SolV[0];i++)
g << SolV[i] << " ";
}
}