Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: FranAI en 15 Noviembre 2021, 01:44 am



Título: Problema de violación de acceso. Árbol recubridor
Publicado por: FranAI en 15 Noviembre 2021, 01:44 am
Hola a todos! Estoy teniendo un problema con un proyecto que he creado para obtener un árbol recubridor (ni mínimo ni máximo) a partir de un grafo precargado, el resultado final debería mostrarme las aristas del arbol recubrido con sus respectivos pesos, el problema es que al compilar por tercera o cuarta vez no me muestra la información completa. Tengo entendido que es un problema de violación de acceso ya que el proceso finalizó con un valor de retorno de 3221225477, en hex: 0xc0000005, el código de windows para indicar violación de acceso.
El problema es que no encuentro el inconveniente en el código.

Código:
#include <bits/stdc++.h>
#include <stdlib.h>
#include <time.h>
using namespace std;

#define V 5


int minKey(int key[V], bool mstSet[V])
{

int min = INT_MAX;
int min_index = 0;

for (int v = 0; v < V; v++)
{
if (mstSet[v] == false && key[v] <= min)
min = key[v], min_index = v;
}
return min_index;
}

int minKey1(int key[V], bool mstSet[V])
{

int min = 0;
int min_index = 0;

for (int v = 0; v < V; v++)
{
if (mstSet[v] == false && key[v] >= min)
min = key[v], min_index = v;
}

return min_index;
}

void printMST(int parent[], int graph[V][V])
{
cout<<"Aristas\tPesos\n";
for (int i = 1; i < V; i++)
{
cout<<parent[i]<<" - "<<i<<" \t"<<graph[i][parent[i]]<<" \n";
}
}


void primMST(int graph[V][V])
{
srand(time(NULL));
int u;
int aleatorio;

int parent[V];


int key[V];


bool mstSet[V];


for (int i = 0; i < V; i++)
{
key[i] = INT_MAX, mstSet[i] = false;
}

key[0] = 0;
parent[0] = -1;


for (int count = 0; count < V - 1; count++)
{

aleatorio = rand()%(2-1+1)+1;
cout << aleatorio << endl;
switch (aleatorio)
{
case 1:
{
u = minKey(key, mstSet);
break;
}

case 2:
{
u = minKey1(key, mstSet);
break;
}

}

mstSet[u] = true;


for (int v = 0; v < V; v++)
{
if (graph[u][v] && mstSet[v] == false && graph[u][v] < key[v])
parent[v] = u, key[v] = graph[u][v];
}
}


printMST(parent, graph);
}


int main()
{

int graph[V][V] = { { 0, 2, 0, 6, 0 },
     { 2, 0, 3, 8, 5 },
     { 0, 3, 0, 0, 7 },
     { 6, 8, 0, 0, 9 },
     { 0, 5, 7, 9, 0 } };


primMST(graph);

return 0;
}


Título: Re: Problema de violación de acceso. Árbol recubridor
Publicado por: Eternal Idol en 15 Noviembre 2021, 09:28 am
Tenes que depurarlo linea por linea, yo lo hice y el problema estaba aca:
Código
  1. cout<<parent[i]<<" - "<<i<<" \t"<<graph[i][parent[i]]<<" \n";

i es 4 y parent no esta inicializado y a su elemento 4 no se le asigna ninguna valor posteriormente:
Código
  1. int parent[V];