Ir para conteúdo
Fórum Script Brasil
  • 0

Grafos em C


Hataro

Pergunta

Bom tava implementando uma biblioteca de grafos e digrafos em C usando lista de adjacência pois acho mais simples de manuzear do que uma que use matriz, e tive uma duvida qnt a buscas de caminhos simples, já tenho uma função para buscar um caminho (pathR, DIGRAPHpath que agem por chamada, a 1° recursivamente) porem não informa o tipo, apenas retorna se há ou não um caminho queria que dessem uma olhada nela e me falassem como poderia ser resolvido o problema de achar um caminho simple em um grafo. :rolleyes:

Tive algumas luzes aki xP e uma idéia seria usar um vetor pra contabilizar os vertiçes caso eles se repitam toda vez q a função pathR fosse executada recursivamente. :wacko: ... mas fico aberto a sugestões.

O código é esse:

//BIBLIOTECA LISTA DE ADJACENCIA
#include "stdio.h"
#include "stdlib.h"
#define Vertex int
#define graph digraph
#define Graph Digraph
#define GRAPHinit DIGRAPHinit
#define GRAPHshow DIGRAPHshow
#define maxV 100

static int lbl[maxV], parnt[maxV][maxV];
typedef struct digraph *Digraph; // Objeto do tipo Digraph que contém o endereço de um digraph
typedef struct node *link;

struct digraph {  // Digrafo
    int V;        // Número de vértices
    int A;        // Número de arestas 
    link *adj;    // Ponteiro para a lista de adjacência (são ou não vizinhos)
};

struct node{
  Vertex w;
  link next;
};

link NEW (Vertex w, link next);
Digraph DIGRAPHinit (int V);
void DIGRAPHinsertA (Digraph G, Vertex v, Vertex w);
void DIGRAPHshow (Digraph G);
void GRAPHinsertE (Graph G, Vertex v, Vertex w);

link NEW (Vertex w, link next){
  link x = malloc(sizeof*x);
  x->w = w;
  x->next = next;
  return x;
}

Digraph DIGRAPHinit (int V){
  Vertex v;
  Digraph G = malloc(sizeof *G);
  G->V = V;
  G->A = 0;
  G->adj = malloc(V * sizeof(link));
  for (v = 0; v < V; v++)
    G->adj[v] = NULL;
  return G;
}

void DIGRAPHinsertA (Digraph G, Vertex v, Vertex w){
  link p;
  if (v == w) return;
  for (p = G->adj[v]; p!=NULL; p = p->next)
    if (p->w== w) return;
  G->adj[v]= NEW(w, G->adj[v]);
  G->A++;
}

GRAPHdeg(Digraph G, Vertex v){
  int x = 0;
  link p;
  for (p = G->adj[v]; p == G->adj[v]; p = p->next)
    x++;
  return x;
}
  
void GRAPHinsertE (Graph G, Vertex v, Vertex w){
  DIGRAPHinsertA(G,v,w);
  DIGRAPHinsertA(G,w,v);
}

void DIGRAPHshow (Digraph G){
  Vertex v;
  link p;
  for (v =0; v < G->V; v++){
    printf("%2d:", v);
    for (p = G->adj[v]; p != NULL; p = p->next)
      printf("%2d", p->w);
    printf("\n");
  }
}

/*void GRAPHremoveE(Digraph G, Vertex v, Vertex w){
  link p, p2;

  for(p = G->adj[v]; p != NULL; p = p->next){
    if(p->next == w)
      p2 = p->next;
      p->next = p2->next;
      printf("\n\n%d %d\n\n",p2,p2->next);
  }
}*/

void pathR (Digraph G, Vertex v){
  link p;
  lbl[v] = 0;
  for (p=G->adj[v]; p != NULL; p=p->next)
    if (lbl[p->w] == -1) {
      parnt[v][p->w] = 1;
      pathR(G,p->w);
    }
}


int DIGRAPHpath (Digraph G,Vertex s,Vertex t){
  Vertex v, y;
  for (v = 0; v < G->V; v++) {
    lbl[v] = -1;
    for(y = 0; y < G->V; y++){
      parnt[v][y] = 0;      
    }
  }
  parnt[s][s] = 1;
  pathR(G,s);
  if (lbl[t] != -1) 
    return 1;
  else 
    return 0;
}


main(){
  link next;
  Digraph g;
  int qtd, n, i, gral, y, a, b;
  
  printf("Informe a quantidade de vertices: ");
  scanf("%d", &n);
  printf("\n");
    
  while (n <= 0) {
    printf("Erro: informe outra quantidade ");
    scanf("%d", &n);
  }
  
  g = DIGRAPHinit(n);
  printf("\n# Inserindo Arcos\n");
  
  printf("\nQuantos arcos deseja inserir: ");
  scanf("%d", &qtd);
  printf("\n");
  
  while ((qtd <= 0) || (qtd > (n * (n - 1)))) {
    printf("Errado! Digite outro: ");
    scanf("%d", &qtd);
  }
  
  Vertex v, w;
  for (i = 0; i < qtd; i++) {
    
    printf("\nArco %d\n", i + 1);
    printf("Informe o arco na forma v-w: ");
    scanf("%d-%d", &v, &next);
    DIGRAPHinsertA(g, v, next);
  }
  

  
  printf("\ndigite o caminho para verificar a existencia(v-w): ");
  scanf("%d-%d", &v, &w);
  y = DIGRAPHpath(g, v, w);  
  
  if(y)
    printf("\nexiste caminho!\n");
  else
    printf("\nnao existe caminho!\n");
  
    
  printf("\nDigrafo formado:\n");
  DIGRAPHshow(g);
  
  /*printf("\n\ninforme o vertece q deseja excluir(v-w)");
  scanf("%d-%d",&v, &w);
  GRAPHremoveE(g, v, w );*/
  
  for(a = 0; a < n; a++){
    printf(" %d ",lbl[a]);
  }
  printf("\n\n");
  for(a = 0; a < n; a++){
    for( b = 0; b < n; b++){
      printf(" %d ",parnt[a][b]);
      }
    printf("\n");  
  }
  
  /*
  printf("\nDigrafo formado com aresta apagada:\n");
  DIGRAPHshow(g);*/
  
  system("pause");
  
}

bom, tem alguns pontos demarcados pois tava aki implementando outras funções, mas o foco é na DIGRAPHpath e pathR. Ainda não ta .h pois só vou implementa-la quando fizer todas as operações em um grafo.

Qualker duvida com o entendimento do código so postar q eu explico.

desde já agradeço!

Editado por quintelab
Removido Dúvida do título e adicionado BBCode Code
Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...