Pagini recente » Istoria paginii utilizator/fulger99999 | Rating Basuc Bogdan-Lucian (Basuc_Bogdan_Lucian_324CA) | Diferente pentru teorema-chineza-a-resturilor intre reviziile 18 si 17 | Cod sursa (job #2758082) | Cod sursa (job #330869)
Cod sursa(job #330869)
#include<stdio.h>
#include<vector>
#include<list>
#include<stack>
#include<algorithm>
using namespace std;
list <int> Graf[100010];
vector <int> Par,Ut,Rez;
stack <int> Stiva;
int n,m;
int Check()
{
for(int i=1;i<=n;i++)
if(Par[i]&1)
return 0;
Stiva.push(1);
while(!Stiva.empty())
{
int Nod=Stiva.top();
Stiva.pop();
for(list <int> ::iterator it=Graf[Nod].begin();it!=Graf[Nod].end();it++)
{
if(Ut[*it])
continue;
Stiva.push(*it);
Ut[*it]=1;
}
}
if(find(Ut.begin()+1,Ut.end(),0)!=Ut.end())
return 0;
return 1;
}
void Delete(int x,int y)
{
Graf[x].erase(Graf[x].begin());
Graf[y].erase(find(Graf[y].begin(),Graf[y].end(),x));
}
void Ciclu(int x)
{
while(!Graf[x].empty())
{
int y=Graf[x].front();
Delete(x,y);
Stiva.push(x);
x=y;
}
}
void Euler()
{
int x=1;
do
{
Ciclu(x);
x=Stiva.top();
Stiva.pop();
Rez.push_back(x);
}while(!Stiva.empty());
}
int main()
{
freopen("ciclueuler.in","r",stdin);
freopen("ciclueuler.out","w",stdout);
scanf("%d%d",&n,&m);
Ut.resize(n+1);Par.resize(n+1);
for(int i=0;i<m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
Par[x]++;Par[y]++;;
Graf[x].push_back(y);
Graf[y].push_back(x);
}
if(!Check())
{
printf("-1");
return 0;
}
Euler();
for(vector <int> ::iterator it=Rez.begin();it!=Rez.end();it++)
printf("%d ",*it);
printf("\n");
return 0;
}