Pagini recente » Cod sursa (job #1505234) | Cod sursa (job #1168446) | Cod sursa (job #2577690) | Cod sursa (job #451790) | Cod sursa (job #1168165)
#include<cstdio>
#include<bitset>
#include<vector>
using namespace std;
const int NMAX = 100000+5;
void Read(),Solve(),Print();
int N,M;
vector<int> V[NMAX];
vector<int> S;
vector<int> Ciclu_Euler;
bitset<NMAX> Viz;
void DFS(int x)
{
vector<int>::iterator it;
S.push_back(x);
Viz[x] = 1;
while(!S.empty())
{
x = S.back();
S.pop_back();
for(it = V[x].begin(); it != V[x].end(); it++)
if(!Viz[*it])
{
S.push_back(*it);
Viz[*it] = 1;
}
}
}
int Eulerian()
{
int i;
DFS(1);
for(i = 1; i <= N; i++)
if(!Viz[i] || V[i].size()%2) return 0;
return 1;
}
void Erase_Edge(int x,int y)
{
vector<int>::iterator it;
for(it = V[x].begin(); it != V[x].end(); it++)
if(*it == y) break;
swap(*it,V[x].back());
V[x].pop_back();
}
int main()
{
Read();
Solve();
Print();
return 0;
}
void Read()
{
int x,y,i;
freopen("ciclueuler.in","r",stdin);
freopen("ciclueuler.out","w",stdout);
scanf("%d%d",&N,&M);
for(i = 1; i <= M; i++)
{
scanf("%d%d",&x,&y);
V[x].push_back(y);
V[y].push_back(x);
}
}
void Solve()
{
int x,y;
if(!Eulerian()) return;
S.push_back(1);
while(!S.empty())
{
x = S.back();
if(V[x].empty())
{
Ciclu_Euler.push_back(x);
S.pop_back();
continue;
}
y = V[x].back();
Erase_Edge(x,y);
Erase_Edge(y,x);
S.push_back(y);
}
}
void Print()
{
int i;
if(Ciclu_Euler.empty())
{
printf("-1\n");
return;
}
for(i = 1; i <= M; i++)
printf("%d ",Ciclu_Euler[i]);
}