int main(void) { grafo g = le_grafo(stdin); long int d = diametro(g); printf("%s\n", nome(g)); printf("%sdirecionado\n", direcionado(g) ? "" : "não "); if ( direcionado(g) ) printf("%sfortemente conexo\n", fortemente_conexo(g) ? "" : "não "); else printf("%sconexo\n", conexo(g) ? "" : "des"); if ( d == infinito ) printf("diâmetro: oo\n"); else printf("diâmetro: %ld\n", d); destroi_grafo(escreve_grafo(stdout, distancias(g))); printf("\n"); return ! destroi_grafo(g); }
static void cria_vizinhanca(grafo g, vertice origem, vertice destino, long int peso){ adjacencia viz_1 = malloc(sizeof(struct adjacencia)); if(viz_1 == NULL) printf("Sem memoria"); else{ viz_1->peso = peso; viz_1->v_origem = origem; viz_1->v_destino = destino; insere_lista(viz_1, origem->adjacencias_saida); origem->grau_saida++; destino->grau_entrada++; if (!direcionado(g)) { // se o grafo não for direcionado, a aresta deve aparecer também na // lista de adjacencia do vertice dest adjacencia viz_2 = malloc(sizeof(struct adjacencia)); if(viz_2 == NULL) printf("Sem memoria"); else{ viz_2->peso = peso; viz_2->v_origem = destino; viz_2->v_destino = origem; insere_lista(viz_2, destino->adjacencias_saida); destino->grau_saida++; origem->grau_entrada++; } } else{ adjacencia viz_3 = malloc(sizeof(struct adjacencia)); if(viz_3 == NULL) printf("Sem memoria"); else{ viz_3->peso = peso; viz_3->v_origem = origem; viz_3->v_destino = destino; insere_lista(viz_3, destino->adjacencias_entrada); } } } g->n_arestas++; }
// O(n) int grau_vertice(int v1, Grafo *grafo) { if(v1 <= 0 || v1 > VERTICES) return -1; // Erro: Vértice está fora dos limites if(grafo == NULL) return -1; // Erro: Grafo é null int direc = direcionado(grafo); int i, grau = 0; if(direc) grau = grau_positivo(v1, grafo) + grau_negativo(v1, grafo); else { v1--; for(i = 0; i < VERTICES; i++) if(grafo->matriz_adjacencia[v1][i] != 0) grau++; } return grau; }