Pagini recente » Cod sursa (job #950034) | Cod sursa (job #353281) | Cod sursa (job #2449046) | Cod sursa (job #964139) | Cod sursa (job #768759)
Cod sursa(job #768759)
#include<fstream>
#include<stack>
#include<list>
#include<queue>
#define pb push_back
#define NN 100001
using namespace std;
ofstream out("ciclueuler.out");
typedef list<int>:: iterator IT;
list<int>G[NN],L;
queue<int>Q;
stack<int>S;
int d[NN],uz[NN],n,m;
void read();
void BFS(int);
int conex();
int par();
int verif();
int solve();
void write(int);
void euler(int);
void stergmuchie(int,int);
int main()
{
read();
write(solve());
return 0;
}
void read()
{
ifstream in("ciclueuler.in");
in>>n>>m;
int x,y;
for(;m;--m)
{
in>>x>>y;
G[x].pb(y);
d[x]++;
G[y].pb(x);
d[y]++;
}
}
void BFS(int start)
{
Q.push(start);
uz[start]=1;
while(!Q.empty())
{
int k=Q.front();
for(IT i=G[k].begin();i!=G[k].end();++i)
if(!uz[*i])
{
Q.push(*i);
uz[*i]=1;
}
Q.pop();
}
}
int conex()
{
BFS(1);
for(int i=2;i<=n;i++)
if(!uz[i])
return 0;
return 1;
}
int par()
{
for(int i=1;i<=n;i++)
if(d[i]%2==1)
return 0;
return 1;
}
int verif()
{
if(!conex())
return 0;
if(!par())
return 0;
return 1;
}
void stergmuchie(int x,int y)
{
d[x]--;
d[y]--;
G[x].pop_front();
for(IT i=G[y].begin();i!=G[y].end();++i)
if(*i==x)
{
G[y].erase(i);
break;
}
}
void euler(int x)
{
while(1)
{
if(G[x].empty())
break;
int y=G[x].front();
S.push(y);
stergmuchie(x,y);
x=y;
}
}
int solve()
{
int x=verif();
if(x==0)
return -1;
do
{
euler(x);
x=S.top();
S.pop();
L.pb(x);
}
while(!S.empty());
return 1;
}
void write(int x)
{
if(x==-1)
out<<-1;
else
{
for(IT i=L.begin();i!=L.end();++i)
out<<*i<<" ";
}
}