Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <list>
- #include <queue>
- #include <functional>
- #include <stdlib.h>
- #define INF 999999999
- using namespace std;
- typedef pair<int, int> iPair; // iPair -> Integer Pair
- class Graph {
- int V; //Cantidad de vertices
- // Como es un grafo con peso, necesitamo guardar
- // vértices y par de pesos para cada vecino que tenga
- list<pair<int, int>> *adj;
- public:
- Graph(int V) {
- this->V = V;
- adj = new list<iPair>[V];
- }
- void addEdge(int u, int v, int w) {
- adj[u].push_back(make_pair(v, w));
- adj[v].push_back(make_pair(u, w));
- }
- void Prim() {
- /*Creamos un priority_queue para almacenar los
- vertices que serán inicializados con el algoritmos Prim*/
- priority_queue<iPair, vector<iPair>, greater<iPair>> pq;
- int src = 0; // Inicializamos el vértice 0 como dato
- /*Creamos un vector para las llaves e inicializamos todas
- las llaves como infinite(INF)*/
- vector<int> key(V, INF);
- /*Creamos un vector para almacenar los padres*/
- vector<int> parent(V, -1);
- /*Para tener noción sí los vértices están dentro del árbol*/
- vector<bool> inTree(V, false);
- pq.push(make_pair(0, src));
- key[src] = 0;
- while (!pq.empty())
- {
- /*El primer vértice en el par de datos tiene la menor llave,
- extraemos el varlo de la priority_queue.
- El vértice está almacenado en el segundo valor del pair*/
- int u = pq.top().second;
- pq.pop();
- inTree[u] = true; // Añadimos el vértice al árbol
- // 'i' lo usaremos para obtener todos los vértices adyacentes de cada vértice
- list<pair<int, int>>::iterator i;
- for (i = adj[u].begin(); i != adj[u].end(); i++) {
- /*Obtenemos el vértice y el peso del adyacente de u*/
- int v = (*i).first;
- int weight = (*i).second;
- if (inTree[v] == false && key[v] > weight) {
- key[v] = weight;
- pq.push(make_pair(key[v], v));
- parent[v] = u;
- }
- }
- }
- for (int i = 1; i < V; ++i) {
- printf("%d - %d\n", parent[i],i);
- }
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement