Pagini recente » Cod sursa (job #782374) | Cod sursa (job #1759110) | Cod sursa (job #3250348) | Cod sursa (job #741392) | Cod sursa (job #1651548)
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("ciclueuler.in");
ofstream fout("ciclueuler.out");
vector< pair<int, int> > g[100010];
int n, m, incep, x, y;
int stiva[500010], k;
int eulerian[100010], izolate;
int muchiiramase;
int bucle[100010];
void dfs(int nod)
{
int vecin;
while(bucle[nod])
{
stiva[++k]=nod;
bucle[nod]--;
}
while(g[nod].size())
{
vecin=g[nod][0].first;
stiva[++k]=vecin;
if(g[nod][0].second==1)
{
g[nod].erase(g[nod].begin());
}
else
g[nod][0].second--;
vector< pair<int, int> > ::iterator j=g[vecin].begin();
for(; (*j).first!=nod; j++);
if((*j).second==1)
{
vecin[g].erase(j);
}
else
(*j).second--;
dfs(vecin);
}
}
int main()
{
fin>>n>>m;
for(int i=1;i<=m;i++)
{
fin>>x>>y;
incep=x;
if(x!=y)
{
eulerian[x]++;
eulerian[y]++;
int i, j;
for(i=0;i<g[x].size();i++)
if(g[x][i].first==y)
{
g[x][i].second++;
break;
}
for(j=0;j<g[y].size();j++)
if(g[y][j].first==x)
{
g[y][j].second++;
break;
}
if(i==g[x].size())
g[x].push_back(make_pair(y, 1));
if(j==g[y].size())
g[y].push_back(make_pair(x, 1));
}
else
bucle[x]++;
}
for(int i=1;i<=n;i++)
if(!eulerian[i])
izolate++;
else
if(!(eulerian[i]%2==0))
//gradul nu e par
{
fout<<-1;
return 0;
}
dfs(incep);
if(muchiiramase)
//nu e conex
{
fout<<-1;
return 0;
}
else
for(int i=1;i<=k;i++)
fout<<stiva[i]<<' ';
return 0;
}