Você está na página 1de 5

Aplique o algoritmo de KRUSKAL para os grafos abaixo

1)

2)

3)

4)

5)
#include<stdio.h>

#define MAX 11

#define NumeroDeVerticesGrafo 8

typedef struct Aresta

int SaiDe, ChegaEm, ValorAresta;

}Aresta;

typedef struct ListaDeAresta

Aresta aresta[MAX];

int NumeroAresta;

}ListaDeAresta;

ListaDeAresta listaAresta, arestasArvoreMinima;

int MatrizGrafo[MAX][MAX] = {

// Matriz que contém as informações das arestas: Valor da Aresta, Sai De, Chega Em

// Valor Aresta: custo da aresta

// Sai De: vértice de onde a aresta sai

// Chega Em: vértice para onde a aresta vai

{2,3,3,4,4,7,7,7,8,8,8}, // Valor da Aresta

{6,0,0,0,5,4,4,5,2,2,3}, // Sai De

{7,1,3,2,6,6,7,7,4,5,5} // Chega Em
};

int NumeroDeVertices = NumeroDeVerticesGrafo;

// Função para ordenar a lista de arestas por valor crescente

void OrdenaPorValorArestaCrescente() {

int i, j;

Aresta temp;

for (i = 1; i < listaAresta.NumeroAresta; i++) {

for (j = 0; j < listaAresta.NumeroAresta-1; j++) {

if (listaAresta.aresta[j].ValorAresta > listaAresta.aresta[j+1].ValorAresta) {

temp = listaAresta.aresta[j];

listaAresta.aresta[j] = listaAresta.aresta[j+1];

listaAresta.aresta[j+1] = temp;

// Função para atualizar o vetor "VetorJaFoiSoSai" removendo arestas já visitadas

void TirarVerticeJaFoiVetor(int VetorJaFoiSoSai[], int saiDe, int ChegaEm) {

int i;

for (i = 0; i < NumeroDeVertices; i++) {

if (VetorJaFoiSoSai[i] == ChegaEm)

VetorJaFoiSoSai[i] = saiDe;

}
// Função para encontrar o valor no vetor "VetorJaFoiSoSai"

int ProcuraValorVetorJaFoiSoSai(int VetorJaFoiSoSai[], int NumeroVertice) {

return(VetorJaFoiSoSai[NumeroVertice]);

// Algoritmo de Kruskal para encontrar a árvore geradora mínima

void kruskalMagic() {

int VetorJaFoiSoSai[MAX], i, saiDe, ChegaEm;

listaAresta.NumeroAresta = 0;

// Construir a lista de arestas a partir da matriz de adjacência

for (i = 0; i < MAX; i++) {

listaAresta.aresta[listaAresta.NumeroAresta].ValorAresta = MatrizGrafo[0][i];

listaAresta.aresta[listaAresta.NumeroAresta].SaiDe = MatrizGrafo[1][i];

listaAresta.aresta[listaAresta.NumeroAresta].ChegaEm = MatrizGrafo[2][i];

listaAresta.NumeroAresta++;

arestasArvoreMinima.NumeroAresta = 0;

for (i = 0; i < NumeroDeVertices; i++)

VetorJaFoiSoSai[i] = i;

// Aplicação do algoritmo de Kruskal para encontrar a árvore geradora mínima

for (i = 0; i < listaAresta.NumeroAresta; i++) {

saiDe = ProcuraValorVetorJaFoiSoSai(VetorJaFoiSoSai, listaAresta.aresta[i].SaiDe);

ChegaEm = ProcuraValorVetorJaFoiSoSai(VetorJaFoiSoSai, listaAresta.aresta[i].ChegaEm);


if (saiDe != ChegaEm) {

arestasArvoreMinima.aresta[arestasArvoreMinima.NumeroAresta] = listaAresta.aresta[i];

arestasArvoreMinima.NumeroAresta = arestasArvoreMinima.NumeroAresta + 1;

TirarVerticeJaFoiVetor(VetorJaFoiSoSai, saiDe, ChegaEm);

// Função para imprimir as arestas e o custo da árvore mínima

void ImprimirArestasECusto() {

int i, cost = 0;

printf("\nSai de\t|Chega em \t|Valor Aresta");

for (i = 0; i < arestasArvoreMinima.NumeroAresta; i++) {

printf("\n%d\t|%d \t|%d", arestasArvoreMinima.aresta[i].SaiDe,


arestasArvoreMinima.aresta[i].ChegaEm, arestasArvoreMinima.aresta[i].ValorAresta);

cost = cost + arestasArvoreMinima.aresta[i].ValorAresta;

printf("\n\nCusto da árvore mínima = %d", cost);

// Função principal

void main() {

kruskalMagic();

ImprimirArestasECusto();

Você também pode gostar