Cod sursa(job #658044)

Utilizator Bit_MasterAlexandru-Iancu Caragicu Bit_Master Data 7 ianuarie 2012 20:29:33
Problema Ciclu Eulerian Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.82 kb
#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;
}