Pagini recente » Cod sursa (job #94503) | Cod sursa (job #325058) | Cod sursa (job #1999619) | Cod sursa (job #1676145) | Cod sursa (job #750997)
Cod sursa(job #750997)
#include <fstream>
#include <vector>
#include <stack>
using namespace std;
const char InFile[]="euler.in";
const char OutFile[]="euler.out";
const int MaxN=100111;
const int MaxM=500111;
ifstream fin(InFile);
ofstream fout(OutFile);
struct EdgeTo
{
EdgeTo(int to=0, int index=0):to(to),index(index){};
int to,index;
};
int N,M,x,y;
char viz[MaxN],vizEdge[MaxM];
vector<EdgeTo> G[MaxN];
vector<int> vsol;
stack<int> S;
void DFS(int nod)
{
viz[nod]=1;
for(vector<EdgeTo>::iterator it=G[nod].begin();it!=G[nod].end();++it)
{
if(!viz[it->to])
{
DFS(it->to);
}
}
}
inline bool Euler()
{
for(register int i=1;i<=N;++i)
{
if(G[i].size()%2==1)
{
return false;
}
}
DFS(1);
for(register int i=1;i<=N;++i)
{
if(!viz[i] && G[i].size()>0)
{
return false;
}
}
for(register int i=1;i<=N;++i)
{
if(viz[i])
{
S.push(i);
break;
}
}
while(!S.empty())
{
int nod=S.top();
if(G[nod].size()==0)
{
S.pop();
vsol.push_back(nod);
}
else
{
EdgeTo E=G[nod][G[nod].size()-1];
if(!vizEdge[E.index])
{
S.push(E.to);
vizEdge[E.index]=1;
}
G[nod].pop_back();
}
}
return true;
}
int main()
{
fin>>N>>M;
for(register int i=1;i<=M;++i)
{
fin>>x>>y;
G[x].push_back(EdgeTo(y,i));
G[y].push_back(EdgeTo(x,i));
}
fin.close();
if(!Euler())
{
fout<<"-1";
}
else
{
vector<int>::iterator last=vsol.end();
--last;
for(vector<int>::iterator it=vsol.begin();it!=last;++it)
{
fout<<*it<<" ";
}
}
fout.close();
return 0;
}