79
int SelectOdd(Graph *G, char *mess, int indx, List *arc_edges, List *verts) {
SEdge E; /* Single Edge */
Node N;
int i, j,oddvertex;

    /* Testa se o grafo e vazio */
    if (G->size < 1) {
        sprintf(mess, "%s", "Empty graph!");
        return 1;
    }

    /* Seta para falso (0) a propriede 'mark' em todos os vertices */
    ClearMarkedVerts(G);

    /* Adiciona o primeiro passo - Nada destacado */
    AddStep(G, arc_edges, verts);

    /* Procura e destaca os vertices impares */
    oddvertex = 0;
    for (i = 1; i < G->size; i++) {

        /* Verifica se i e um numero impar */
        if ((i % 2)) {
            /* Marca o vertices para uso futuro */
            G->vertex[i].mark = 1;
            oddvertex = i;

            /* Coloca em um novo nodo o vertice impar */
            N = MakeNode(&oddvertex, sizeof(int));

            /* Coloca o nodo na lista de vertices especiais */
            InsertNode(verts, N);

            /* Adiciona novo passo - Salva o vertice destacado */
            AddStep(G, arc_edges, verts);
        }
    }

    /* Seta para falso (0) a propriede 'mark' em todas as arestas */    
    ClearMarkedEdges(G);

    /* Procura por um vertice impar adjacente a outro vertice impar */
    for (i = 0; i < G->size; i++) {
        for (j = 0; j < G->size; j++) {

            /* Evita o salvamento do passo [j,i] porque o passo [i,j] ja foi salvo */
            if (!G->prop[j][i].mark && \

                /* Verdadeiro se o vertex[i] e adjacente ao vertex[j] */
                G->edge[i][j] && \

                /* Verdadeiro se o vertex[i] e um vertice impar */
                G->vertex[i].mark && \

                /* Verdadeiro se o vertex[j] e um vertice impar */
                G->vertex[j].mark) {

                /* Marca a aresta para uso futuro */
                G->prop[i][j].mark = 1;

                /* Atribui um vertice impar adjacente a outro vertice impar no vertice simples */
                E.u = i;
                E.v = j;

                /* Coloca em um novo nodo a aresta simples  */
                N = MakeNode(&E, sizeof(SEdge));

                /* Coloca o nodo na lista de arestas especiais */
                InsertNode(arc_edges, N);

                /* Adiciona novo passo - Salva a aresta destacada */
                AddStep(G, arc_edges, verts);
            }
        }
    }

    return 1;
}

