Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: m@o_614 en 24 Octubre 2013, 01:19 am



Título: Libreria de grafos
Publicado por: m@o_614 en 24 Octubre 2013, 01:19 am
Saludos

Tengo que hacer un programa que me dice que cree un grafos simple( no permite mas de una arista entre dos vertices), que sean dirigido o no dirigido y que puede agregar o eliminar aristas y vertices, pero la verdad no tengo muy claro si debo de hacerlo con un arreglo de listas que es una opcion que me dijo el profesor que podia hacer, pero yo la veo muy dificil porque nunca he hecho un arreglo de listas, y tampoco se si tengo que pedirle el numero de vertices y de aristas al inicio del programa, si tengo que verificar que no este vacio el grafo antes de eliminar un vertice,si los vertices los represento como nodos las aristas tambien las tengo que crear como nodos??,puedo crear una arista aun si no tengo vertices?? esto lo tengo que validar tambien?? les agredeceria que me dieran algunas sugerencias de como empezarlo porque no tengo ni la mas minima idea

gracias


Título: Re: Libreria de grafos
Publicado por: rir3760 en 24 Octubre 2013, 03:19 am
Una opcion para almacenar los vertices es una lista, la otra una matriz. Como siempre puedes empezar revisando sitios como Wikipedia (http://en.wikipedia.org/wiki/Graph_theory).

Un saludo


Título: Re: Libreria de grafos
Publicado por: m@o_614 en 24 Octubre 2013, 21:49 pm
gracias rir3760 por tu respuesta, tu te refieres a almacenar los vertices con una lista ligada y las aristas con una matriz??? grafo[vertice1][vertice2] = arista, donde arista esta entre el vertice1 y el vertice2, pero si los vertices son nodos de una lista como los voy a poner como indice de una matriz??


Título: Re: Libreria de grafos
Publicado por: rir3760 en 25 Octubre 2013, 16:22 pm
En una matriz de adyacencias solo almacenas el peso del vértice o bien un valor especial para indicar que el vértice entre las aristas no existe. El caso de la lista de adyacencias es similar (solo si existe el vértice se almacena el peso correspondiente).

Si tenemos este grafo:
Código:
A ---- B ---- C ---- D
       |      |
       |      |
       E ---- F

La matriz de adyacencias es:
Código:
  A B C D E F
A - 4 - - - -
B 4 - 4 - 2 -
C - 4 - 4 - 2
D - - 4 - - -
E - 2 - - - 4
F - - 2 - 4 -
Donde cada entrada "matriz[ i ][ j ]" indica si las aristas están conectadas o no.

Un saludo


Título: Re: Libreria de grafos
Publicado por: m@o_614 en 30 Octubre 2013, 05:04 am
Saludos, ya comence a hacer el codigo, primero tengo una typedef struct que me indica que voy a tener una matriz de tipo int a la que le tengo que asignar memoria dinamicamente y el numero de vertices, le pido cuantos vertices y aristas quiero, y despues inicializo el grafo, osea que cada uno de los elementos de la matriz sean -1  indicandome que no hay arista entre los vertices i y j, pero no se si esta parte y la de agregarArista estan bien hechas, exactamente esta parte:

Código
  1. void inicializaGrafo(Grafo *grafo,int num)
  2. {
  3.    int i,j,valor;
  4.    grafo->numVertices = num;
  5.    grafo->elementos = (int**)malloc(valor = num*num*sizeof(int));
  6.    for(i=0;i < num;i++)
  7.    {
  8.        for(j=0;j < num;j++)
  9.           grafo->elementos[i][j] = -1;
  10.    }
  11. }
  12.  

el codigo completo es este:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define AGREGAR_ARISTAS 1
  4. #define ELIMINAR_ARISTAS 2
  5. #define SALIR 3
  6.  
  7. typedef struct
  8. {
  9.    int **elementos;
  10.    int numVertices;
  11. }Grafo;
  12.  
  13. int max_aristas(int num);
  14. void agregarArista(int arista,int vertice1,int vertice2,Grafo *grafo);
  15.  
  16. int main()
  17. {
  18.    Grafo grafo;
  19.    int opcion,numAristas,num,continuar = 1,maximo,arista,vertice1,vertice2;
  20.    printf("Libreria de Grafos!!\n");
  21.    printf("Dame numero de vertices: ");
  22.    scanf("%d",&num);
  23.    printf("Dame numero de aristas: ");
  24.    scanf("%d",&numAristas);
  25.    maximo = max_aristas(num);
  26.    if(numAristas > maximo)
  27.       printf("Error! El grafo no puede tener mas de %d aristas",maximo);
  28.    else
  29.    {
  30.        inicializaGrafo(&grafo,num);
  31.        do
  32.        {
  33.            printf("1. Agregar Arista\n");
  34.            printf("2. Eliminar Vertice\n");
  35.            printf("3. Eliminar Arista\n");
  36.            printf("4. Salir\n\n");
  37.            scanf("%d",&opcion);
  38.            case AGREGAR_ARISTAS:
  39.               printf("Dame el valor de la arista: ");
  40.               scanf("%d",&arista);
  41.               printf("Dame el valor del primer vertice: ");
  42.               scanf("%d",&vertice1);
  43.               printf("Dame el valor del segundo vertice: ");
  44.               scanf("%d",&vertice2);
  45.               agregarArista(arista,vertice1,vertice2,&grafo);
  46.               break;
  47.            case ELIMINAR_ARISTAS:
  48.               //eliminarArista();
  49.               break;
  50.            case SALIR:
  51.               continuar = 0;
  52.               break;
  53.            default: printf("Opcion invalida\n");
  54.        }while(continuar);
  55.    }
  56.    return 0;
  57. }
  58.  
  59. int max_aristas(int num)
  60. {
  61.    int maximo;
  62.    maximo = (num(num-1))/2;
  63.    return maximo;
  64. }
  65.  
  66. void inicializaGrafo(Grafo *grafo,int num)
  67. {
  68.    int i,j,valor;
  69.    grafo->numVertices = num;
  70.    grafo->elementos = (int**)malloc(valor = num*num*sizeof(int));
  71.    for(i=0;i < num;i++)
  72.    {
  73.        for(j=0;j < num;j++)
  74.           grafo->elementos[i][j] = -1;
  75.    }
  76. }
  77.  
  78. void agregarArista(int arista,int vertice1,int vertice2,Grafo *grafo)
  79. {
  80.    grafo->elementos[vertice1][vertice2] = arista;
  81. }
  82.  

gracias