Pagini recente » Diferente pentru blog/viata-dupa-olimpiade-2 intre reviziile 12 si 1 | Istoria paginii utilizator/vladmosnegutu | Istoria paginii utilizator/rzvnden | Monitorul de evaluare | Cod sursa (job #1442445)
#include <iostream>
#include <fstream>
#include <vector>
#define MAX 100005
using namespace std;
vector <int> vec[MAX];
int q[10*MAX],st[10*MAX],gr[MAX],v[MAX];
int n,m,varf;
int poz;
ifstream f("ciclueuler.in");
ofstream g("ciclueuler.out");
void cr()
{
f>>n>>m;
int i,x,y;
for(i=1; i<=m; i++)
{
f>>x>>y;
vec[x].push_back(y);
vec[y].push_back(x);
gr[x]++;
gr[y]++;
}
}
void dfs(int k)
{
v[k]=1;
for(int i=0; i<vec[k].size(); i++)
if(!v[vec[k][i]])
dfs(vec[k][i]);
}
int conex()
{
int i;
dfs(1);
for(i=1; i<=n; i++)
if(v[i]==0)
return 0;
return 1;
}
int grad()
{
int i;
for(i=1; i<=n; i++)
if(gr[i]%2==1)
return 0;
return 1;
}
void euler()
{
int i,j,k;
varf=1;
st[varf]=1;
while(varf>0)
{
k=st[varf];
while(vec[k].size()>0)
{
i=vec[k][0];
swap(vec[k][0],vec[k][vec[k].size()-1]);
vec[k].pop_back();
//for(j=0; j<vec[i].size() && vec[i][j]!=k; j++)
swap(vec[i][j],vec[i][vec[i].size()-1]);
vec[i].pop_back();
st[++varf]=i;
k=st[varf];
}
varf--;
q[++poz]=k;
}
}
int main()
{
cr();
if(conex() && grad())
{
euler();
for(int i=1; i<=poz; i++)
g<<q[i]<<" ";
}
return 0;
}