Ejemplo n.º 1
0
//------------------------------------------------------------------------------
// destroi um vertice
static void destroi_vertice(vertice v){
    destroi_lista(v->adjacencias_saida, (int (*)(void *)) destroi_vizinho);
    destroi_lista(v->adjacencias_entrada, (int (*)(void *)) destroi_vizinho);
    v->grau_saida = 0;
    v->grau_entrada = 0;
    free(v->nome);
    free(v);
    v =  NULL;
}
Ejemplo n.º 2
0
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;
}
Ejemplo n.º 3
0
static int destroi_vertice( void *ptr ){

	struct vertice *v = ptr;

	if( v ){
		free(v->nome);
		int e = destroi_lista( v->arestas_entrada, destroi_aresta );
		int s = destroi_lista( v->arestas_saida,   destroi_aresta );
		if( e && s ) {
			free( v );
			return 1;
		}
	}
	return 0;
}
Ejemplo n.º 4
0
void main(void)
	{
		char resp;
		char texto[20];
		no_tipo  *L_pilha ;
		/* variavel local a main ==> na PILHA */

		printf (" \n Criando uma lista + pointer na PILHA.... (nao na HEAP) ");
		L_pilha = NULL; /* inicializa o ponteiro .... */
	//	printf ("\n Conteudo:: %x Onde estah:: %x. Conteudo Indireto:: ", L_pilha, &L_pilha);
		do
		{
			printf("\n DIGITE NOME: ");
			scanf("%s", texto );
			ins_lst(texto, & L_pilha );
			fflush(stdin);
			printf("\n Mais alguem (s ou S): ");
			resp = (char)toupper(getche());
			printf("\n.........................");
		}
		while(resp == 'S');
		imp_lista( L_pilha );
		destroi_lista( & L_pilha );
		printf ("\n Apos a exclusao\n\n");
		imp_lista( L_pilha );
		puts("\n..... SUCESSO......");
	}
Ejemplo n.º 5
0
grafo escreve_grafo(FILE *output, grafo g) {

	if(!(g && output)) return NULL;

	vertice v;
	aresta  a;
	no nv, na;

    fprintf( output, "strict %sgraph \"%s\" {\n\n", g->direcionado ? "di" : "", g->nome );

    // Imprime vertices

	for( nv = primeiro_no(g->vertices); nv; nv = proximo_no(nv) ){
		v = conteudo(nv);
		fprintf( output, "    \"%s\"\n", v->nome );
	}
	fprintf( output, "\n" );

    // Imprime arestas

	lista la = arestas(g);
	const char *dir = g->direcionado ? "->" : "--";
	for( na = primeiro_no(la); na; na = proximo_no(na) ){
		a = conteudo(na);
		fprintf( output, "    \"%s\" %s \"%s\"", nome_vertice(a->origem), dir, nome_vertice(a->destino) );
		if( g->ponderado ) fprintf( output, " [peso=%ld]", a->peso );
		fprintf( output, "\n" );
	}
    fprintf( output, "}\n" );
    destroi_lista(la, NULL);

    return g;
}
Ejemplo n.º 6
0
//------------------------------------------------------------------------------
static Agraph_t *mostra_grafo(Agraph_t *g) {

  if ( ! g )
    return NULL;

  direcionado = agisdirected(g);

  n_vertices = agnnodes(g);

  n_arestas = agnedges(g);
  
  lista_arestas = constroi_lista();

  printf("strict %sgraph \"%s\" {\n\n",
         agisdirected(g) ? "di" : "",
         agnameof(g)
         );

  mostra_vertices(g);

  printf("\n");

  mostra_arestas();

  printf("}\n");

  destroi_lista(lista_arestas, NULL);

  return g;
}
Ejemplo n.º 7
0
grafo emparelhamento_maximo(grafo g){
	
    if( !g ) return NULL;
    
    lista  lv;
	while((lv = caminho_aumentante(g)) != NULL) {
		xor(lv);
		destroi_lista(lv, NULL);
	}
    return grafo_emparelhamento(g);
}
Ejemplo n.º 8
0
int destroi_grafo(void *g) {

	struct grafo *r = g;

	if( r ) {
		free( r->nome );
		if( destroi_lista( r->vertices, destroi_vertice ) ){
			free( g );
			return 1;
		}
	}
	return 0;
}
Ejemplo n.º 9
0
//------------------------------------------------------------------------------
//
static lista caminho_aumentante(grafo g) {

	if( !g ) return NULL;
    
    lista l;
	
    for( no n = primeiro_no(g->vertices); n; n = proximo_no(n) ){
        vertice v = conteudo(n);
		if( !v->coberto ) {
			v->visitado = 1;
			l = constroi_lista();
			if( busca_caminho(v, l, 1) ) {
				return l;
            } 
            else {
				printf("busca deu errado\n");
				desvisita_vertices(g);
				destroi_lista(l, NULL);
            }
        }
	}
	desvisita_vertices(g);
	return NULL;
} 
Ejemplo n.º 10
0
int main(void){
    ListaEnc *lista;
    TipoInfo *info, *aux;

    int escolha = -1;
    char valor1[30];
    char valor2[30];
    int  valor3 = -1000;
    int pos = -1;
    int flag=0;

     while ((escolha = menu())!= 0){
        switch (escolha){
        case 1:
            flag++;
            lista = criaLista(); break;
        case 2:
            valor3 = estah_vazia(lista);
            system("clear");

            if(valor3 == 1)
                printf("A lista esta vazia\n");
            else
                printf("A lista nao esta vazia\n");
            printf("\nObs: Quando a lista encadeada esta vazia, adicionar registro no fim\ne no inicio corresponde a uma mesma operacao.\n");
            break;
        case 3:
            system("clear");
            printf("Informe o nome do usuario: ");
            scanf("%s", valor1);

            printf("Informe o curso do usuario: ");
            scanf("%s", valor2);

            printf("Informe a fase em que se encontra o usuario: ");
            scanf("%d", &valor3);

            system("clear");
            info = criaInfo(valor1, valor2, valor3);
            adicionaNoInicio(lista, info); break;
        case 4:
            system("clear");
            printf("Informe o nome do usuario: ");
            scanf("%s", valor1);

            printf("Informe o curso do usuario: ");
            scanf("%s", valor2);

            printf("Informe a fase em que se encontra o usuario: ");
            scanf("%d", &valor3);

            system("clear");
            if(lista->tamanho > 1){
                imprime_lista(lista);

                do{
                    printf("Podera inserir registros entre o 1o e o ultimo registro inclusive\n");
                    printf("Informe a posicao que desejas inserir este registro: ");
                    scanf("%d", &pos); }while(pos <= 0 || pos >= lista->tamanho);

                info = criaInfo(valor1, valor2, valor3);
                adicionaNaPosicao(lista, info, pos);
            }else if(lista->tamanho <= 1  ){
                info = criaInfo(valor1, valor2, valor3);
                adicionaNoInicio(lista, info);
            }

            break;
        case 5:
            system("clear");
            printf("Informe o nome do usuario: ");
            scanf("%s", valor1);

            printf("Informe o curso do usuario: ");
            scanf("%s", valor2);

            printf("Informe a fase em que se encontra o usuario: ");
            scanf("%d", &valor3);

            system("clear");
            info = criaInfo(valor1, valor2, valor3);
            adicionaNoFim(lista, info); break;
        case 6:
            aux = retiraDoInicio(lista);
            system("clear");
            printf("Registro retirado\n\nNome de usuario: %s\nCurso do usuario: %s\nFase em que o usuario se encontra: %d", aux->nome, aux->curso, aux->fase); break;
        case 7:
            aux = retiraDoFim(lista);
            system("clear");
            printf("Registro retirado\n\nNome de usuario: %s\nCurso do usuario: %s\nFase em que o usuario se encontra: %d", aux->nome, aux->curso, aux->fase); break;
        case 8:
            imprime_lista(lista); break;
        case 9:
            if(flag == 1){
                flag--;
                destroi_lista(lista);
            }else
                printf("Nao ha lista para destruir\n");
        }
    }
    if(flag == 1){
        destroi_lista(lista);
    }

    return 0;
}
Ejemplo n.º 11
0
//------------------------------------------------------------------------------
int main(void) {
  struct grafo *g, *d, *c;
  struct vertice *v;
  struct no *n;
  lista l;

  g = le_grafo(stdin);
  escreve_grafo(stdout, g);

  if((l = ordena(g)) != NULL) {
    for(n = primeiro_no(l); n != NULL; n = proximo_no(n)) {
      v = (struct vertice *) conteudo(n);
      fprintf(stdout, "%s\n", nome_vertice(v));
    }

    destroi_lista(l, nao_destroi_nos);
  }

  if((l = componentes(g)) != NULL) {
    for(n = primeiro_no(l); n != NULL; n = proximo_no(n)) {
      c = (struct grafo *) conteudo(n);
      escreve_grafo(stdout, c);
    }

    destroi_lista(l, destroi_grafo);
  }

  d = arvore_geradora_minima(g);
  if(d != NULL) {
    escreve_grafo(stdout, d);
    destroi_grafo(d);
  }


  /*
  d = arborescencia_caminhos_minimos(g, v);
  if(d != NULL) {
    escreve_grafo(stdout, d);
    destroi_grafo(d);
  }
  */

  d = distancias(g);
  if(d != NULL) {
    escreve_grafo(stdout, d);
    destroi_grafo(d);
  }

  fprintf(stdout, "Diametro = %ld\n", diametro(g));

  if(conexo(g)) {
    fprintf(stdout, "Conexo!\n");
  } else {
    fprintf(stdout, "Não é conexo!\n");
  }

  if(fortemente_conexo(g)) {
    fprintf(stdout, "Fortemente conexo!\n");
  } else {
    fprintf(stdout, "Não é fortemente conexo!\n");
  }

  /*if((l_blocos = blocos(g)) != NULL) {
    fprintf(stderr, "\n--Blocos criados:\n" );
    for(n = primeiro_no(l); n != NULL; n = proximo_no(n)) {
      c = (struct grafo *) conteudo(n);
      escreve_grafo(stdout, c);
    }

    destroi_lista(l_blocos, destroi_grafo);
  }*/

  destroi_grafo(g);
  return 0;
}