elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recuerda que debes registrarte en el foro para poder participar (preguntar y responder)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Libreria de grafos
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Libreria de grafos  (Leído 6,484 veces)
m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
Libreria de grafos
« 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


« Última modificación: 24 Octubre 2013, 02:36 am por m@o_614 » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Libreria de grafos
« Respuesta #1 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.

Un saludo


En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
Re: Libreria de grafos
« Respuesta #2 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??
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Libreria de grafos
« Respuesta #3 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
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
m@o_614


Desconectado Desconectado

Mensajes: 389


Ver Perfil
Re: Libreria de grafos
« Respuesta #4 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
« Última modificación: 30 Octubre 2013, 05:06 am por m@o_614 » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Grafos
Java
soser 1 3,094 Último mensaje 4 Noviembre 2010, 22:53 pm
por Debci
Siguiendo con grafos...
Java
soser 0 1,687 Último mensaje 23 Noviembre 2010, 06:38 am
por soser
grafos
Programación General
kailon 3 3,506 Último mensaje 6 Junio 2011, 16:54 pm
por Valkyr
Imprimir Grafos en C
Programación C/C++
JorgeKun 0 11,627 Último mensaje 12 Junio 2011, 21:59 pm
por JorgeKun
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines