79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
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;
}