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

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


  Mostrar Mensajes
Páginas: [1]
1  Programación / Programación C/C++ / Imprimir Grafos en C en: 12 Junio 2011, 21:59 pm
 :D Buen dia!!
Oigan alguien me podria hechar la mano, tengo un codigo que me crea un grafo, el problema es que necesito imprimirlo graficamente, esta hecho en C.
Estoy tratando con la libreria graphics.h pero me marca el error de que no es compatible en windows, alguien sabe como solucionar esto? o tiene una mejor idea sobre como imprimir?
abajo esta el codigo que solo me imprime el recorrido en forma de listado...
Código:
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <conio.h>
#include <string.h>
#define MaxNodos 47

typedef struct nodo_ {
    int etiqueta;
    float peso;
    struct nodo_ *sig;
}Tnodo;

/** variables globales */
Tnodo *Lista[MaxNodos]; //lista de adyacencia
int marca[MaxNodos]; //visitados
int predecesores[MaxNodos]; //ruta
float d[MaxNodos]; // distancia - peso
int Num_Vertices; //numero de vertices
int tipo; //1 no dirigido, 0 dirigido
 char uanl[250][250]; //Arreglo de nombres UANL
/** ------------------ */

/* Inicializa la lista de adyacencia a NULL */
void init() {
    int i;
    for (i = 0; i < MaxNodos; i++)
        Lista[i] = NULL;
}

int lista (int tipo)/*FUNCION QUE DESPLIEGA LA LISTA PARA SELECCIONAR LA OPCION DEL USUARIO*/
{
 int val=0;
do
{
 printf("\n\n\tSeleccione una opcion");
 int j=0;
 switch(tipo)
 {
  case 1: printf("\n\n\tCIUDAD UNIVERSITARIA");

  for(j=1;j<=28;j++)
  printf("%s\n",uanl[j]);

         break;
  case 2:printf("\n\n\tPREPARATORIAS");
  for(j=29;j<=47;j++)
  printf("%s\n",uanl[j]);

         break;
 };
 printf("\n\n\tIntroduzca el numero de la lista que desee...");
 scanf("%d",&val);
 clrscr();
}while(val<1 || val > 47);
 return val;
 }

/* Inserta los vertices en la lista de adyacencia */
void inserta (int Vorigen, int Vfinal, float peso) {
    Tnodo *q;
    q = (Tnodo*) malloc (sizeof(Tnodo) * 1);
    if (!q) return; //hubo un error
    q->etiqueta = Vfinal-1;
    q->peso     = peso;
    q->sig      = NULL;
    if (Lista[Vorigen-1] != NULL)
       q->sig = Lista[Vorigen-1];
    Lista[Vorigen-1] = q;
}

/* Libera la lista de adyacencia */
void liberar_lista (void) {
   Tnodo *q;
   int i;
   for (i = 0; i <  Num_Vertices; i++) {
      if (Lista[i] != NULL) {
         while (Lista[i] != NULL) {
            q = Lista[i];
            Lista[i] = Lista[i]->sig;
            free(q);
         }
      } //--fin si (no necesarias las llaves)
   } //--fin for (no necesaria las llaves)
}

/* Carga el grafo desde un fichero */
void cargar_grafo (char *fn) {
  FILE *fp;
  int v_in, v_fn; //vertice inicial y final
  float peso;
  if ((fp = fopen (fn, "r")) == NULL) {
       printf ("El archivo %s no existe o no se puede abrir\n", fn);
       getche();
       exit(0);
   }
   fscanf (fp, "%d\n", &tipo); //tipo es una vble global
   fscanf (fp, "%d\n", &Num_Vertices); //Num_Vertices es una vble global
   while (!feof(fp)){
         fscanf(fp, "%d %d %f\n", &v_in, &v_fn, &peso);
         inserta(v_in, v_fn, peso);
         inserta (v_fn, v_in, peso);
   }
   fclose (fp);
} // fin cargar_grafo
void cargar_nombres (char *fn) {
  FILE *fp;
    if ((fp = fopen (fn, "r")) == NULL) {
       printf ("El archivo %s no existe o no se puede abrir\n", fn);
       getche();
       exit(0);
   }

        int i=1;
        char caracteres[150];

        printf("\nEl contenido del archivo de prueba es \n\n");
        while (feof(fp) == 0)
        {
        fgets(caracteres,100,fp);
                strcpy(uanl[i], caracteres);
                i++;
        }
         fclose (fp);
} // fin cargar_nombres


/* Retorna el peso de la arista que une dos nodos */
float return_peso (int origen, int destino) {
   Tnodo *p;
   int encontrado;

   encontrado = 0;
   p = Lista[origen];
   while (p != NULL && !encontrado) {
      if (p->etiqueta == destino)
        encontrado = 1;
      else
        p = p->sig;
   }
   return p->peso;
}


int menor_valor() {
   int i, verticeMenor;
   float menor;
   menor = INT_MAX;
   for (i = 0; i < Num_Vertices; i++) {
      if (marca[i] == 0 )
         if (menor > d[i]) {
            menor = d[i];
            verticeMenor = i;
         }
   } // fin for
   return verticeMenor;
}

/* Dijkstra */
void dijkstra (int origen, int destino)
{
   int i, last, x;
   Tnodo *p;
   // inicializacion
   for (i = 0; i < MaxNodos; i++) {
      d[i] = INT_MAX; //"infinito"
      marca[i] = 0;
      predecesores[i] = -1;
   }
   // --
   d[origen] = 0;
   marca[origen] = 1;
   last = origen;
   while (marca[destino] == 0) { //hasta que no lleguemos al destino
      p = Lista[last];
      while (p != NULL){   //para todos los nodos adyacendes
          if (marca[p->etiqueta] == 0) //si no ha sido visitado
          if (d[p->etiqueta] > d[last] + return_peso(last, p->etiqueta))
              {
              d[p->etiqueta] = d[last] + return_peso(last, p->etiqueta);
              predecesores[p->etiqueta] = last;
          } // fin si
           p = p->sig;
      } // fin mientras
      x = menor_valor();
      marca[x] = 1;
      last = x;
   } // fin mientras
}

/* Imprime la ruta por pantalla */
void ImprimirCamino(int v) {
   if (v != -1)
      ImprimirCamino(predecesores[v]);
   if (v != -1) //evitamos que se imprima el -1
      {

                 printf("%s\n",uanl[v+1]);

      }
}

/* Menu de opciones */
int menu() {
    int opcion;
    do {
        printf ("\n\n\t[0] Salir\n\t");
        printf ("[1] Calcular ruta\n\n");
        printf ("Opcion:_");
        scanf("%d", &opcion);
    }while (opcion < 0 || opcion > 1);
    return opcion;
}

/* Funcion principal */
int main () {
    char file[25];
    int origen, destino,opi,tipo=0;
    int salir = 0;
    printf("\n\n\n\tBIENVENIDO\n\n\t...Presione cualquier tecla para comenzar..._");
    getche();
    init();
    cargar_grafo("GrafoUANL.txt");
    cargar_nombres("ListadoUANL.txt");
    clrscr();
    printf("\n\n\tSeleccione una opcion...");
    do {
        switch(menu())
        {
            case 0:
                  salir = 1;
                  break;
            case 1:
                     while(tipo!=1&&tipo!=2)
      {
      clrscr();
                           printf("\n\tSi desea partir de una facultad introduzca 1\n\tSi desea partir de una preparatoria introduca 2....._");
                           scanf("%d",&tipo);

      }
                        origen = lista (tipo);
      tipo=0;
while(tipo!=1&&tipo!=2)
      {
      clrscr();
printf("\n\tSi desea llegar de una facultad introduzca 1\n\tSi desea llegar de una preparatoria introduca 2....._");
                           scanf("%d",&tipo);
                        }
                      destino= lista (tipo);
                     dijkstra(origen-1, destino-1);
                    printf("\n\n\tLA RUTA MAS RAPIDA ES....\n\n");
                  ImprimirCamino(destino-1);
                  break;
        }; //final switch
    tipo=0;
    }while(!salir);
    liberar_lista();

    }
2  Programación / Programación C/C++ / Re: Ayuda con mi proyecto de grafos en: 12 Junio 2011, 18:38 pm
Bueno el proyecto funciono muy bien :D, sin embargo me fue muy mal y tendre que presentarlo de nuevo :-( todo debido a que no imprimi el grafo en manera de grafica, yo lo imprimi en un simple listado  :-X
3  Programación / Programación C/C++ / Re: Ayuda con mi proyecto de grafos en: 29 Mayo 2011, 20:55 pm
Primero que nada muchas gracias ya entendi perfectamente mi error, y tambien que el proyecto es poco eficiente pero en fin es tarea xD.
Segundo esa parte del archivo no es codigo mio por eso no entendia que hacer pero gracias a su ayuda ya lo entendi!!!
Muchas gracias!!, espero serle util a alguien tambien algun dia  ;)
Mas tarde posetare el resultado final y ya mañana les dire que tal me fue presentadolo ante mi clase
4  Programación / Programación C/C++ / Re: Ayuda con mi proyecto de grafos en: 29 Mayo 2011, 20:25 pm
Tienes razon yo seguia un patron Origen---Costo de arista----Destino,
pero solo una duda, disculpa si sueno muy noob, pero al llegar a las aristas en tu ejemplo como esta declarado, ejemplo:
0    1    15
el primero y ultimo son los nodos y el de enmedio es el costo? o estoy entendiendo mal?  :-X
5  Programación / Programación C/C++ / Re: Ayuda con mi proyecto de grafos en: 29 Mayo 2011, 20:03 pm
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <limits.h>
  4. #include <conio.h>
  5.  
  6. #define MaxNodos 10
  7.  
  8. typedef struct nodo_ {
  9.    int etiqueta;
  10.    float peso;
  11.    struct nodo_ *sig;
  12. }Tnodo;
  13.  
  14. /** variables globales */
  15. Tnodo *Lista[MaxNodos]; //lista de adyacencia
  16. int marca[MaxNodos]; //visitados
  17. int predecesores[MaxNodos]; //ruta
  18. float d[MaxNodos]; // distancia - peso
  19. int Num_Vertices; //numero de vertices
  20. int tipo; //1 no dirigido, 0 dirigido
  21. /** ------------------ */
  22.  
  23. /* Inicializa la lista de adyacencia a NULL */
  24. void init() {
  25.    int i;
  26.    for (i = 0; i < MaxNodos; i++)
  27.        Lista[i] = NULL;    
  28. }
  29.  
  30. /* Muestra la lista de adyacencia (un simple debug) */
  31. void mostrar_lista_adyacencia () {
  32.   Tnodo *q;
  33.   int i;
  34.  
  35.   for (i = 0; i < Num_Vertices; i++) {
  36.      if (Lista[i] != NULL) {
  37.         q = Lista[i];
  38.         printf ("vertice %d: ", i);
  39.         while (q) {
  40.            printf ("%d ", q->etiqueta);
  41.            q = q->sig;
  42.         }
  43.         printf("\n");
  44.      }
  45.   }
  46. }
  47.  
  48. /* Inserta los vertices en la lista de adyacencia */
  49. void inserta (int Vorigen, int Vfinal, float peso) {
  50.    Tnodo *q;
  51.    q = (Tnodo*) malloc (sizeof(Tnodo) * 1);
  52.    if (!q) return; //hubo un error
  53.    q->etiqueta = Vfinal-1;
  54.    q->peso     = peso;
  55.    q->sig      = NULL;
  56.    if (Lista[Vorigen-1] != NULL)
  57.       q->sig = Lista[Vorigen-1];
  58.    Lista[Vorigen-1] = q;
  59. }
  60.  
  61. /* Libera la lista de adyacencia */
  62. void liberar_lista (void) {
  63.   Tnodo *q;
  64.   int i;
  65.   for (i = 0; i <  Num_Vertices; i++) {
  66.      if (Lista[i] != NULL) {
  67.         while (Lista[i] != NULL) {
  68.            q = Lista[i];
  69.            Lista[i] = Lista[i]->sig;
  70.            free(q);
  71.         }
  72.      } //--fin si (no necesarias las llaves)
  73.   } //--fin for (no necesaria las llaves)
  74. }
  75.  
  76. /* Carga el grafo desde un fichero */
  77. void cargar_grafo (char *fn) {
  78.  FILE *fp;
  79.  int v_in, v_fn; //vertice inicial y final
  80.  float peso;
  81.  if ((fp = fopen (fn, "r")) == NULL) {
  82.       printf ("El archivo %s no existe o no se puede abrir\n", fn);
  83.       getche();
  84.       exit(0);
  85.   }
  86.   fscanf (fp, "%d\n", &tipo); //tipo es una vble global
  87.   fscanf (fp, "%d\n", &Num_Vertices); //Num_Vertices es una vble global
  88.   while (!feof(fp)){
  89.         fscanf(fp, "%d %d %f\n", &v_in, &v_fn, &peso);
  90.         inserta(v_in, v_fn, peso);
  91.         inserta (v_fn, v_in, peso);
  92.   }
  93.   fclose (fp);
  94. } // fin cargar_grafo
  95.  
  96. /* Retorna el peso de la arista que une dos nodos */
  97. float return_peso (int origen, int destino) {
  98.   Tnodo *p;
  99.   int encontrado;
  100.  
  101.   encontrado = 0;
  102.   p = Lista[origen];
  103.   while (p != NULL && !encontrado) {
  104.      if (p->etiqueta == destino)
  105.        encontrado = 1;
  106.      else
  107.        p = p->sig;
  108.   }
  109.   return p->peso;
  110. }
  111.  
  112.  
  113. int menor_valor() {
  114.   int i, verticeMenor;
  115.   float menor;
  116.   menor = INT_MAX;
  117.   for (i = 0; i < Num_Vertices; i++) {
  118.      if (marca[i] == 0 )
  119.         if (menor > d[i]) {
  120.            menor = d[i];
  121.            verticeMenor = i;
  122.         }
  123.   } // fin for
  124.   return verticeMenor;
  125. }
  126.  
  127. /* Dijkstra */
  128. void dijkstra (int origen, int destino)
  129. {
  130.   int i, last, x;
  131.   Tnodo *p;
  132.   // inicializacion
  133.   for (i = 0; i < MaxNodos; i++) {
  134.      d[i] = INT_MAX; //"infinito"
  135.      marca[i] = 0;
  136.      predecesores[i] = -1;
  137.   }
  138.   // --
  139.   d[origen] = 0;
  140.   marca[origen] = 1;
  141.   last = origen;
  142.   while (marca[destino] == 0) { //hasta que no lleguemos al destino
  143.      p = Lista[last];
  144.      while (p != NULL){   //para todos los nodos adyacendes
  145.          if (marca[p->etiqueta] == 0) //si no ha sido visitado
  146.          if (d[p->etiqueta] > d[last] + return_peso(last, p->etiqueta))
  147.              {
  148.              d[p->etiqueta] = d[last] + return_peso(last, p->etiqueta);
  149.              predecesores[p->etiqueta] = last;
  150.          } // fin si
  151.           p = p->sig;
  152.      } // fin mientras
  153.      x = menor_valor();    
  154.      marca[x] = 1;
  155.      last = x;
  156.   } // fin mientras
  157. }
  158.  
  159. /* Imprime la ruta por pantalla */
  160. void ImprimirCamino(int v) {
  161.   if (v != -1)
  162.      ImprimirCamino(predecesores[v]);
  163.   if (v != -1) //evitamos que se imprima el -1
  164.      printf("%d ",v+1);
  165. }
  166.  
  167. /* Menu de opciones */
  168. int menu() {
  169.    int opcion;
  170.    do {
  171.        printf ("\n[0] Salir\n");
  172.        printf ("[1] Calcular ruta\n");  
  173.        printf ("Opcion: ");
  174.        scanf("%d", &opcion);
  175.    }while (opcion < 0 || opcion > 1);
  176.    return opcion;
  177. }
  178.  
  179. /* Funcion principal */
  180. int main () {
  181.    char file[25];
  182.    int origen, destino;
  183.    int salir = 0;
  184.    printf ("Cargar fichero?: ");
  185.    scanf("%s", file);
  186.    init();
  187.    cargar_grafo(file);
  188.    mostrar_lista_adyacencia(); //debug
  189.    do {
  190.        switch(menu()) {
  191.            case 0:
  192.                 salir = 1;
  193.                 break;
  194.            case 1:
  195.                  do {
  196.                      printf ("Vertice origen: "); scanf("%d", &origen);
  197.                      printf ("Vertice destino: "); scanf("%d", &destino);
  198.                      if (origen < 1 || origen > MaxNodos || destino < 1 || destino > MaxNodos)
  199.                           printf ("Error: El rango tiene que estar comprendido entre 1 y %d\n", Num_Vertices);
  200.                  }while (origen < 1 || origen > Num_Vertices || destino < 1 || destino > Num_Vertices);    
  201.                  dijkstra(origen-1, destino-1);
  202.                  ImprimirCamino(destino-1);
  203.                  break;          
  204.        }; //final switch
  205.    }while(!salir);    
  206.    liberar_lista();
  207. }
  208.  
Este codigo lo encontre navegando por ahiy empeze a basarme en el, veran funciona bien el problema es que no entiendo la manera en que me carga el archivo.
He estado experimentando un poco y al poner en el .txt "1 2 3" entiendo que lo toma como ,nodoOrigen,Costo,nodoDestino, pero aun asi me pierdo durante la ejecucion del codigo y no me entrega las distancias :/, espero me puedan ayudar a entender como abre el archivo porfavor y como lo trabaja, ya que ese es mi problema, gracias de antemano  :-*
6  Programación / Programación C/C++ / Re: Ayuda con mi proyecto de grafos en: 29 Mayo 2011, 19:47 pm
entiendo su punto pero vera en un proyecto para la facultad donde se nos pidio emplear grafos para dicho proposito y si he estado tratando con una rchivo pero me da problemas , sigo revisando el codigo.
Creo que optare por hacer la matriz de adyacencia de 45x45, aunque espero terminar...es para mañana  :-X
Gracias por su tiempo  :-*
7  Programación / Programación C/C++ / Ayuda con mi proyecto de grafos en: 28 Mayo 2011, 20:21 pm
Veran tengo que hacer un proyecto de un tipo GPS usando grafos, mi problema radica en que no se como declarar un grafo que tendra 45 nodos y sera estatico, el resultado de mi programa espero que sea algo como:
Si usted parte de.... pasara por ...,...,...,..., ese es el camino mas optimo y el peso es x.

Utilizando el algoritmo de Dijkstra, pero llevo un par de dias teniendo problemas declarando el grafo, ahora intento hacerlo usando una lista de adyacencia pero es mucho codigo declarando los 45 nodos :/, espero me puedan hechar una mano.
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines