Pagini recente » Cod sursa (job #321006) | Cod sursa (job #658044)
Cod sursa(job #658044)
#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(int nod)
{
sol[++ns] = nod;
for (unsigned int i = 0; i < muchie_nod[nod].size(); ++i)
if ((*muchie_nod[nod][i]).tip == de_intoarcere)
{
(*muchie_nod[nod][i]).tip = parcurs;
ciclu_eulerian(vecin(nod,*muchie_nod[nod][i]));
}
for (unsigned int i = 0; i < muchie_nod[nod].size(); ++i)
if ((*muchie_nod[nod][i]).tip == de_arbore)
{
(*muchie_nod[nod][i]).tip = parcurs;
ciclu_eulerian(vecin(nod,*muchie_nod[nod][i]));
}
}
void scrie()
{
for (int i = 1; i <= ns-1; ++i)
printf("%d ",sol[i]);
}
int main()
{
citeste();
dfs(1);
ciclu_eulerian(1);
scrie();
return 0;
}