Advertisement
Guest User

Prim Priority_queue

a guest
May 24th, 2019
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.99 KB | None | 0 0
  1. #include <iostream>
  2. #include <list>
  3. #include <queue>
  4. #include <functional>
  5. #include <stdlib.h>
  6. #define INF 999999999
  7.  
  8. using namespace std;
  9.  
  10. typedef pair<int, int> iPair; // iPair -> Integer Pair
  11.  
  12. class Graph {
  13. int V; //Cantidad de vertices
  14.  
  15. // Como es un grafo con peso, necesitamo guardar
  16. // vértices y par de pesos para cada vecino que tenga
  17. list<pair<int, int>> *adj;
  18.  
  19. public:
  20. Graph(int V) {
  21. this->V = V;
  22. adj = new list<iPair>[V];
  23. }
  24.  
  25. void addEdge(int u, int v, int w) {
  26. adj[u].push_back(make_pair(v, w));
  27. adj[v].push_back(make_pair(u, w));
  28. }
  29.  
  30. void Prim() {
  31. /*Creamos un priority_queue para almacenar los
  32. vertices que serán inicializados con el algoritmos Prim*/
  33. priority_queue<iPair, vector<iPair>, greater<iPair>> pq;
  34. int src = 0; // Inicializamos el vértice 0 como dato
  35.  
  36. /*Creamos un vector para las llaves e inicializamos todas
  37. las llaves como infinite(INF)*/
  38. vector<int> key(V, INF);
  39.  
  40. /*Creamos un vector para almacenar los padres*/
  41. vector<int> parent(V, -1);
  42.  
  43. /*Para tener noción sí los vértices están dentro del árbol*/
  44. vector<bool> inTree(V, false);
  45.  
  46. pq.push(make_pair(0, src));
  47. key[src] = 0;
  48. while (!pq.empty())
  49. {
  50. /*El primer vértice en el par de datos tiene la menor llave,
  51. extraemos el varlo de la priority_queue.
  52. El vértice está almacenado en el segundo valor del pair*/
  53. int u = pq.top().second;
  54. pq.pop();
  55. inTree[u] = true; // Añadimos el vértice al árbol
  56.  
  57. // 'i' lo usaremos para obtener todos los vértices adyacentes de cada vértice
  58. list<pair<int, int>>::iterator i;
  59. for (i = adj[u].begin(); i != adj[u].end(); i++) {
  60. /*Obtenemos el vértice y el peso del adyacente de u*/
  61. int v = (*i).first;
  62. int weight = (*i).second;
  63.  
  64. if (inTree[v] == false && key[v] > weight) {
  65. key[v] = weight;
  66. pq.push(make_pair(key[v], v));
  67. parent[v] = u;
  68. }
  69. }
  70. }
  71. for (int i = 1; i < V; ++i) {
  72. printf("%d - %d\n", parent[i],i);
  73. }
  74. }
  75. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement