Pagini recente » Cod sursa (job #1914954) | Cod sursa (job #1372404) | Cod sursa (job #2163873) | Cod sursa (job #2520801) | Cod sursa (job #928213)
Cod sursa(job #928213)
#include<stdio.h>
#include<vector>
using namespace std;
FILE *f = fopen("ciclueuler.in","r");
FILE *g = fopen("ciclueuler.out","w");
#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;
fscanf(f,"%d %d",&N,&M);
for(int i=1;i<=M;i++)
{
fscanf(f,"%d %d",&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;
StPoz[++k] = -1;
}
}
else
{
//printf("%d ",St[k]);
SolV[++SolV[0]] = St[k--];
}
}
}
int main()
{
citire();
if(!esteEuler())
fprintf(g,"-1\n");
else
{
euler();
for(int i=1;i<SolV[0];i++)
fprintf(g,"%d ",SolV[i]);
}
}