Problema de violación de acceso. Árbol recubridor

Iniciado por FranAI, 15 Noviembre 2021, 01:44 AM

0 Miembros y 1 Visitante están viendo este tema.

FranAI

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.

#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;
}


Eternal Idol

Tenes que depurarlo linea por linea, yo lo hice y el problema estaba aca:
Código (c++) [Seleccionar]
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 (c++) [Seleccionar]
int parent[V];
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón