Pagini recente » Cod sursa (job #540151) | Cod sursa (job #617566) | Cod sursa (job #2296114) | Cod sursa (job #1424691) | Cod sursa (job #930869)
Cod sursa(job #930869)
#include<stdio.h>
#include<list>
#include<queue>
#include<stack>
using namespace std;
#define max 100010
list<int> roads[max],resault;
stack<int> S;
queue<int> Q;
int n,m,gr[max],shit[max];
void BFS(int node)
{
Q.push(node),shit[node]=1;
while(!Q.empty())
{
node=Q.front();Q.pop();
for(list<int>::iterator it=roads[node].begin();it!=roads[node].end();it++)
if(shit[*it]==0)
Q.push(*it),shit[*it]=1;
}
}
int is_connected()
{
BFS(1);
for(int i=2;i<=n;i++)
if(shit[i]==0)
return 0;
return 1;
}
int is_eu()
{
if(!is_connected)
return 0;
for(int i=1;i<=n;i++)
if(gr[i]%2==1)
return 0;
return 1;
}
void erase(int a,int b)
{
gr[a]--,gr[b]--;
roads[a].pop_front();
for(list<int>::iterator it=roads[b].begin();it!=roads[b].end();it++)
if(*it==a)
{
roads[b].erase( it );
break;
}
}
void eu(int node)
{
for(;;)
{
if( roads[node].empty() )
break;
int sec=roads[node].front();
S.push(node);
erase(node,sec);
node=sec;
}
}
int solve()
{
int a=is_eu();
if(a==0)
return -1;
do
{
eu(a);
int q=S.size();
a=S.top();
S.pop();
resault.push_back(a);
}while(!S.empty());
return 1;
}
int main()
{
freopen("ciclueuler.in","r",stdin);
freopen("ciclueuler.out","w",stdout);
scanf("%d%d",&n,&m);
for(;m>0;m--)
{
int x,y;
scanf("%d%d",&x,&y);
roads[x].push_back(y),gr[x]++;
roads[y].push_back(x),gr[y]++;
}
int x=solve();
if(x==-1)
printf("-1");
else
for(list<int>::reverse_iterator it=resault.rbegin();it!=resault.rend();it++)
printf("%d ",*it);
return 0;
}