Você está na página 1de 4

Aplique o algoritmo de PRIM para os grafos abaixo

1)

Não é permitido numeros negativos no peso das arestas leve em consideração que alem de -3 seja 3;
Aplicando o algoritmo prim começando pelo vértice 1:

2)

Começando pelo vértice 8

3)

Começando pelo vértice "M"

4)

Começando pelo vértice "C"

5)

Começando pelo vértice 1


print do código

(precisa de zoom)

código escrito

#include <iostream>

#include <vector>

#include <queue>

#include <utility>

using namespace std;

int N, M;

int main(){

//Enquanto estiver lendo N, M e o N não for 0

while(cin >>N >>M and N){

//montando grafo

vector< vector<pair<int,int>>>G(N);

//Lista de adjacência

for(int i = 0; i<M;i++){

int u,v,cost;

cin >>u >>v >>cost;

G[u].push_back({v, cost});

G[v].push_back({u, cost});

}
//fila prioridade com custo e nó associado

priority_queue<pair<int,int>> prim;

//Digo que visito um vertice e coloco todas arestas na fila de prioridade

vector<bool> mark(N, false);

//marco vertice 0 como visitado

mark [0] =true;

//percorre todas arestas que saem do 0

for(pair<int,int> ed: G[0]){

//adiciono no meu prim

prim.push({-ed.second, ed.first});

int soma = 0;

//enquanto meu primt tiver tamanho

while(prim.size()){

//pego a aresta de menor tamanho

pair<int, int> menor = prim.top();

// remove essa fila de prioridade

prim.pop();
// se a aresta me leva para um vertice ja visitado ignora

if (mark[menor.second] == true) continue;

soma += -menor.first;

mark[menor.second] = true;

for (pair<int, int> ed : G[menor.second]){

// adiciono no meu prim

prim.push({-ed.second, ed.first});

cout <<soma<<endl;

Você também pode gostar