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

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


  Mostrar Mensajes
Páginas: 1 ... 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 [53] 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 ... 102
521  Programación / Programación General / Re: Codigo para saber si este grafo es conexo en: 20 Septiembre 2019, 02:29 am
me has dejado mas perdido desde que arranque, me dices una cosa y luego otra , no logro entender que es lo que me quieres decir , solo necesito saber que correcciones hago puntualmente, porque tus explicaciones no me quedan muy claras
Pero si te digo cambia esto por esto y no entiendes por qué lo haces, es lo mismo que no avanzar. El objetivo es que entiendas el problema y seas capaz de encontrar la solución por ti mismo.
Te expliqué lo que era un grafo conexo y un grafo completo, te comenté las características de la matriz de adyacencia de un grafo conexo y de un grafo completo y te puse un pseudocódigo de cómo identificar un grafo conexo.
No me has entendido, no pasa nada. Prefiero hacer otro intento para explicártelo en vez de darte la solución. Me he dado cuenta de que yo te he puesto dos códigos en los que trato a la función <esConexo()> como una función de la clase principal y no de la clase <Matriz_de_adyacencia>, fallo mío. Igual eso te ha confundido más. Empiezo otra vez:

Aquí tienes un ejemplo de una matriz de adyacencia de un grafo conexo (ya que ninguna fila ni ninguna columna está compuesta únicamente de 0) y no dirigido (ya que la matriz es simétrica respecto a la diagonal principal):
Código:
0  1  1  0  1
1  0  1  0  1
1  1  0  1  0
0  0  1  0  1
1  1  0  1  0
Y aquí tienes un ejemplo de una matriz de adyacencia de un grafo completo (ya que los únicos 0 están en la diagonal principal) y no dirigido (ya que la matriz es simétrica también respecto a la diagonal principal):
Código:
0  1  1  1  1
1  0  1  1  1
1  1  0  1  1
1  1  1  0  1
1  1  1  1  0

Ahora vamos a ver cómo funciona tu función:
Citar
Código
  1. public boolean esConexoo(){
  2.    boolean conexoo = true; // supones que el grafo es conexo
  3.    for(int i = 0; i < matriz.length; i++){ // para cada fila i...
  4.        for(int j = 0; j < matriz.length; j++){ // ...recorremos cada columna j y...
  5.            if(i != j && matriz[i][j] == 0){ // ...si no estamos en la diagonal principal y esa casilla tiene un 0...
  6.                conexoo = false; // ...el grafo deja de ser conexo
  7.                break; // y dejamos de comprobar columnas para esa fila y pasamos a la siguiente fila
  8.            }
  9.        }
  10.    }
  11.    System.out.println(conexoo); // mostramos el resultado de la funcion
  12.    return false; // y retornamos siempre false
  13. }
Cuál es el problema de esta función? Que en cuanto se cumplen las dos condiciones del <if>, se determina que la matriz no es conexa y eso no es cierto. Esa función sería correcta si su función fuese determinar si un grafo es o no completo. Además como consejo personal y que es una buena práctica te recomiendo quitar el <System.out.println(conexoo)> porque es mejor no mostrar el resultado por pantalla dentro de la propia función. Es mejor retornar el resultado y aprovecharlo fuera de la función como indico aquí:
Citar
Código
  1. public static void main(String[] args){
  2.    Matriz_de_adyacencia matriz = new Matriz_de_adyacencia[5][5];
  3.    // dar valores a la matriz de adyacencia
  4.  
  5.    if(matriz.esConexo())
  6.        System.out.println("El grafo es conexo");
  7.    else
  8.        System.out.println("El grafo no es conexo");
  9. }
Te explico también porque es mejor no poner el mensaje dentro de la función. Imagina que tienes 50 grafos (es decir, 50 matrices) en un vector y quieres guardar en otro vector sólo los que son conexos. Tendrías que hacer un bucle para las 50 matrices y si se cumple que es conexo, guardarla en otro vector. Para realizar ese cálculo seguramente no te interese mostrar por pantalla cada resultado, no? Por eso es mejor no mostrar mensajes dentro de la función.
Y el último problema de tu función que he citado un poco más arriba es la última línea: <return false>. La "gracia" de la función es devolver <true> cuando el grafo es conexo y devolver <false> cuando no lo es. Si devuelves siempre <false> pues no tendrá mucho sentido. Entonces para devolver <true> o <false> dependiendo de lo que valga la variable <conexoo> lo que tienes que hacer es devolver la propia variable: <return conexoo>. Así cuando <conexoo> valga <true>, estarás retornando <true> y cuando <conexoo> valga <false>, estarás retornando <false>.

Para intentar dejarlo lo más claro posible te explico ahora el pseudocódigo que te puse anteriormente en otro mensaje:
PD: Lo he modificado un poco para hacerlo más fácil de entender aunque un poco menos eficiente. El original seguirá estando en el otro mensaje que puse anteriormente.
Citar
Código:
matriz[N][N]
i := 0
conexo = true // suponemos que el grafo es conexo
mientras conexo and i < N // mientras siga siendo conexo y no se acaben las filas, para cada fila...
    conexo = false // ...suponemos que no es conexo y empezamos a comprobar cada columna de esa fila...
    j := 0
    mientras !conexo and j < N // ...mientras siga sin ser conexo y no se acaben las columnas...
        conexo = (matriz[i][j] != 0) // ...si la casilla vale 0, sigue sin ser conexo (false) pero si es distinto de 0, vale true para pasar a la siguiente fila directamente
        j := j + 1
    fin mientras
    i := i + 1
fin mientras
return conexo // ...cuando acabas de recorrer toda la matriz devuelves el valor de <conexo> ya sea true o false

Espero que con esta explicación te haya quedado un poco más claro. Si tienes alguna duda sobre una parte específica de todo lo explicado puedes citar esa parte y exponer tu duda para poder centrarme en aclararte esa parte.
522  Programación / Programación General / Re: Codigo para saber si este grafo es conexo en: 19 Septiembre 2019, 23:22 pm
Primero de todo te recomiendo quitar el mensaje de la función <esConexo()>. Es mejor que la función sólo retorne un resultado y luego decidir tú si mostrarlo por pantalla o no. Respecto a tu duda de true/false. Piensa que vas a utilizar esta función:
Código
  1. public static void main(String[] args){
  2.    Matriz_de_adyacencia matriz = new Matriz_de_adyacencia[5][5];
  3.    // dar valores a la matriz de adyacencia
  4.  
  5.    if(esConexo(matriz))
  6.        System.out.println("El grafo es conexo");
  7.    else
  8.        System.out.println("El grafo no es conexo");
  9. }
Entonces si preguntamos si es conexo, la función tendrá que devolver <true> si sí que es conexo y false si no es cierto que sea conexo. En tu caso estás devolviendo siempre <false> porque has puesto <return false>.

Además de todo lo anterior, me parece que esa función que has implementado no es del todo correcta. En el momento que una casilla es 0, se cambia el valor de <conexo> a <false> y con que una casilla sea 0 el grafo no deja de ser conexo. Esa función sería correcta si se encargara de determinar si el grafo es completo, no conexo.
523  Programación / Programación General / Re: Codigo para saber si este grafo es conexo en: 19 Septiembre 2019, 08:54 am
Yo crearía directamente una función:
Código
  1. public static boolean esConexo(matrizDeAdyacencia){
  2.    // compruebas si es conexo
  3.    // retornas el resultado
  4. }
Y la forma de hacerlo depende como te he dicho antes de si el grafo es dirigido o no. Si sabemos como precondición del ejercicio que el grafo no es dirigido bastaría con comprobar filas o columnas (una de las dos). Si el grafo es dirigido o podría ser dirigido, entonces debemos comprobar filas y columnas. Te pongo una forma de hacerlo en pseudocódigo para grafos no dirigidos. Luego te queda que lo implementes en java.
Código:
matriz[N][N]
i := 0
mientras conexo and i < N
    conexo = (matriz[i][0] != 0)
    j := 1
    mientras !conexo and j < N
        conexo = (matriz[i][j] != 0)
        j := j + 1
    fin mientras
    i := i + 1
fin mientras
524  Programación / Programación General / Re: Codigo para saber si este grafo es conexo en: 18 Septiembre 2019, 22:49 pm
Voy a comentarte la parte teórica de los grafos y cómo se relaciona esto con la matriz de adyacencia del correspondiente grafo. Primero 3 definiciones:
  • Matriz de adyacencia: matriz en la que para cada i y para cada j, M[j] = 0 si no existe un camino del vértice i al vértice j y M[j] = 1 si sí que existe un camino del vértice i al vértice j.
  • Grafo conexo: grafo que para todo vértice Vi, existe j != i tal que Vi está conectado con Vj. Dicho de otra manera, un grafo conexo no tiene ningún vértice aislado.
  • Grafo completo: grafo que tiene todos los vértices conectados con todos los vértices. Dicho de otra manera puedes ir directamente desde cualquier vértice a cualquier otro vértice.
Ahora viene la relación de estos grafos con su matriz de adyacencia:
  • Un grafo es conexo si en su matriz de adyacencia no existe ningún índice <i> tal que la fila <i> y la columna <i> estén compuestas únicamente por 0 (ambas al mismo tiempo, fila y columna). En grafos no dirigidos bastaría con comprobar una de las dos, la fila o la columna.
  • Un grafo es completo si en su matriz de adyacencia sólo existen 0 en la diagonal principal.

Con todos estos datos creo que ya puedes implementarlo tú en tu programa. Espero que todas las explicaciones sean claras y sobre todo, correctas. Suerte :-X
525  Programación / Programación C/C++ / Re: [C] Exámen de Algoritmos en: 18 Septiembre 2019, 21:31 pm
Siento ser el que te informe de que nadie te va a hacer el ejercicio. Este foro no funciona así, no podemos estar haciendo tareas a todos los que las piden.
Si quieres yo te animo a que lo intentes tú y que mires libros, pdfs, páginas sobre el lenguaje,... Cuando tengas un problema específico, muestra tus avances (todo el código o la parte que creas conveniente) y será entonces cuando recibas ayuda. Suerte :-X
526  Programación / Java / Re: java.lang.ArrayIndexOutOfBoundsException en funcion en: 18 Septiembre 2019, 14:15 pm
Si tu matriz tiene por ejemplo un tamaño de 5x5, los índices van de 0 a 4. Por lo que en la condición del while es: p < a.length (sobra el =).
527  Programación / Programación C/C++ / Re: Problema k-paired (k-emparejados) en O(N) en: 18 Septiembre 2019, 12:40 pm
El enunciado dice que i-j=0, sin embargo no hay pares en {1, 2, 3} ,dónde la resta de dos elementos del conjunto de 0.

Citar
Dado un vector de enteros V[0..N) , con todos sus componentes siguiendo un orden stricto creciente, (1,5,17,20) y un numero k >=0 , diseñar un algoritmo de complejidad lineal que resuelva el número de pares de componentes <i,j> , con 0 <= i, j < N, tales que Vi-Vj = k.
En ese supuesto, las soluciones serían:
  • (0,0) ya que V[0] - V[0] = k
  • (1,1) ya que V[1] - V[1] = k
  • (2,2) ya que V[2] - V[2] = k
Donde para todas las soluciones se cumplen todas las condiciones del enunciado. Es más se puede dar por supuesto que como el orden debe ser estrictamente creciente (no hay repetidos), siempre que k = 0, el número de pares que satisfacen las condiciones es N y por tanto la solución también.
528  Programación / Programación C/C++ / Re: Problema k-paired (k-emparejados) en O(N) en: 18 Septiembre 2019, 08:36 am
En éste no veo como puede dar 3 de resultado.

Supongo que son todos los pares (i, j) donde i = j. Como son 3 elementos, pues 3 pares.
529  Programación / Programación C/C++ / Re: Ayuda para programacion en c en: 16 Septiembre 2019, 14:53 pm
Muy bien, ya tenemos el enunciado del ejercicio pero se te ha olvidado poner dónde está tu duda... :silbar:
Si en realidad el asunto de este tema no era "ayuda para programacion en c" y lo que querías poner era "Alguien que me haga la tarea" no te va a funcionar. En el foro ayudamos a hacer ejercicios tanto guiando sobre un problema concreto o localizando los errores que pueda tener un código, pero desde luego que nadie va a hacerte el ejercicio y te lo va a dar hecho.

Lo siento por tomármelo con humor pero son muchos los que se crean una cuenta y su primera aportación en el foro (y muchas veces, la última) es el enunciado de un ejercicio hecho. Si quieres ayuda, coloca tu código usando las etiquetas de Código GeSHi para que lo veamos o concreta qué ayuda necesitas para poder empezar. Si no quieres eso y prefieres esperar a alguien que te lo dé hecho... Suerte, la vas a necesitar.  :-X
530  Programación / Programación C/C++ / Re: Duda con Ficheros C++ en: 15 Septiembre 2019, 02:46 am
Como bien te han dicho, si te aparecen 2 endl será que el propio fichero acaba con un endl.
Puede que el endl del final del fichero lo hayas colocado tú manualmente o que tengas alguna opción activada en el editor para que añada automáticamente un endl al final de un fichero antes de guardarlo.
Páginas: 1 ... 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 [53] 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 ... 102
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines