Pagini recente » Monitorul de evaluare | Istoria paginii utilizator/laviandra_2005 | Monitorul de evaluare | Monitorul de evaluare | Cod sursa (job #658049)
Cod sursa(job #658049)
#include <cstdio>
#include <vector>
using namespace std;
const int N_MAX = 100010;
const int M_MAX = 500010;
const int parcurs = 0;
const int de_arbore = 1;
const int de_intoarcere = 2;
struct mch
{
int a,b;
char tip;
};
vector<mch*> muchie_nod[N_MAX]; int n,m;
mch muchie[M_MAX];
bool vizitat[N_MAX];
int sol[M_MAX],ns=0;
void citeste()
{
int a,b;
freopen("ciclueuler.in","r",stdin);
freopen("ciclueuler.out","w",stdout);
scanf("%d%d",&n,&m);
for (int i = 1; i <= m; ++i)
{
scanf("%d%d",&a,&b);
muchie[i] = (mch){a,b,de_intoarcere};
muchie_nod[a].push_back(&muchie[i]);
muchie_nod[b].push_back(&muchie[i]);
}
}
inline int vecin(int nod, mch muchie)
{
return (muchie.a == nod)?muchie.b:muchie.a;
}
void dfs(int nod)
{
vizitat[nod] = true;
for (unsigned int i = 0; i < muchie_nod[nod].size(); ++i)
if (!vizitat[ vecin(nod,*muchie_nod[nod][i]) ])
{
(*muchie_nod[nod][i]).tip = de_arbore;
dfs(vecin(nod,*muchie_nod[nod][i]));
}
}
void ciclu_eulerian()
{
unsigned int i;
int nod = 1;
bool continuare = true;
while (continuare)
{
sol[++ns] = nod;
continuare = false;
for (i = 0; i < muchie_nod[nod].size(); ++i)
if ((*muchie_nod[nod][i]).tip == de_intoarcere)
{
(*muchie_nod[nod][i]).tip = parcurs;
nod = vecin(nod,*muchie_nod[nod][i]);
continuare = true;
break;
}
if (continuare)
continue;
for (i = 0; i < muchie_nod[nod].size(); ++i)
if ((*muchie_nod[nod][i]).tip == de_arbore)
{
(*muchie_nod[nod][i]).tip = parcurs;
nod = vecin(nod,*muchie_nod[nod][i]);
continuare = true;
break;
}
}
}
void scrie()
{
for (int i = 1; i <= ns-1; ++i)
printf("%d ",sol[i]);
}
int main()
{
citeste();
dfs(1);
ciclu_eulerian();
scrie();
return 0;
}