Cod sursa(job #658049)

Utilizator Bit_MasterAlexandru-Iancu Caragicu Bit_Master Data 7 ianuarie 2012 20:42:11
Problema Ciclu Eulerian Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 2.12 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()
{
    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;
}