Mai intai trebuie sa te autentifici.
Cod sursa(job #352679)
Utilizator | Data | 3 octombrie 2009 00:20:59 | |
---|---|---|---|
Problema | Ciclu Eulerian | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.36 kb |
#include<iostream>
#include<vector>
#include<algorithm>
#include<stdio.h>
#include<stack>
#include<queue>
using namespace std;
#define nMax 100010
int n,m;
vector <int> a[nMax];
vector <int> par(nMax,0);
vector <int> rez;
stack <int> st;
int check()
{
for(int i=1;i<=n;i++)
if(par[i]%2)
return 0;
vector <int> ut(n+1,0);
st.push(1);
while(!st.empty())
{
int N=st.top();
st.pop();
for(vector <int> ::iterator it=a[N].begin();it!=a[N].end();it++)
{
if(ut[*it])
continue;
ut[*it]=1;
st.push(*it);
}
}
if(find(ut.begin()+1,ut.end(),0)!=ut.end())
return 0;
return 1;
}
void del(int x,int y)
{
a[x].erase(find(a[x].begin(),a[x].end(),y));
a[y].erase(find(a[y].begin(),a[y].end(),x));
}
void ciclu(int x)
{
while(!a[x].empty())
{
int y=a[x].front();
del(x,y);
st.push(x);
x=y;
}
}
void eul()
{
int x=1;
do
{
ciclu(x);
x=st.top();
st.pop();
rez.push_back(x);
}while(!st.empty());
for(int i=0;i<(int)rez.size();i++)
printf("%d ",rez[i]);
printf("\n");
}
int main()
{
freopen("ciclueuler.in","r",stdin);
freopen("ciclueuler.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
a[x].push_back(y);
a[y].push_back(x);
par[x]++;par[y]++;
}
if(check())
eul();
else
printf("-1\n");
return 0;
}