int sao_isomorfos(grafo g, grafo f) { int i = 0; int j, k; int iso = 0; int tam = g.n_vertices; int *tmp = (int*) malloc(sizeof(int)); int v[tam], t_perm = 0; lista *perm; perm = constroi_lista(); for(i=0; i < tam; i++) { v[i] = i; } if((g.n_vertices != f.n_vertices) || (g.arestas != f.arestas) || (!iguais(g, f))) return iso; perm = nova_permuta(perm, v, 0, tam); t_perm = tamanho_lista(perm); for(i=0; i < t_perm; i++) { tmp = (int*) remove_lista(perm); //mostre(tmp, tam); iso = 1; for(j=0; j < tam; j++) { for(k=0; k < tam; k++) { if(g.matriz[j][k] != f.matriz[tmp[j]][tmp[k]]) { iso = 0; /*printf("Nao e isomorfo - "); mostre(tmp, tam);*/ break; } } if(!iso) break; } if(iso) { /*printf("E isomorfo - "); mostre(tmp, tam);*/ destroi_lista(perm); return 1; } } destroi_lista(perm); return 0; }
void remove_chave (LISTA *l, int v, int *status) { int i; *status = 0; for (i=0; i<(l->numElementos); i++) { if (l->nos[i] == v) { remove_lista (l, i, status); i--; } } return; }