¿Cómo podemos implementar el algoritmo de Prim rápidamente en los concursos de programación?

Puede usar en C ++ STL.

  #include 
 #include 
 #include 
 #incluye 
 #include 
 #include 

 usando el espacio de nombres estándar;

 typedef vector  vi;
 typedef vector  vvi;
 typedef pair  ii;
 typedef vector  vii;
 typedef vector  vvii;
 #define all (c) (c) .begin (), c.end ()
 #define sz (c) int ((c) .size ())
 #define tr (c, i) para (typeof ((c) .begin ()) i = (c) .begin (); i! = (c) .end (); ++ i)
 #definir presente (c, x) ((c) .find (x)! = (c) .end ())
 #define cpresent (c, x) (find (all (c), x)! = (c) .end ())


 vii Prim_MST (vvii y G) {
   int n = sz (G);
   vector  D (n, INT_MAX), padre (n, 0);
   vector  abarcado (n, falso);
   establecer  Q;
   vii mst_edges;
   D [0] = 0;
   Q.inserción (ii (0, 0));
   while (! Q.empty ()) {
     ii arriba = * Q.begin ();
     Q.erase (Q.begin ());
     abarcado [top.second] = verdadero;
     int v = top.second;
     si (v! = 0) {
       mst_edges.push_back (ii (padre [v], v));
     }
     tr (G [v], it) {
       int v2 = it-> first, cost = it-> second;
       if (D [v2]> cost &&! spanned [v2]) {
         if (presente (Q, ii (D [v2], v2))) {
           Q.erase (Q.find (ii (D [v2], v2)));
         }
         D [v2] = costo;
         Q.insert (ii (costo, v2));
         padre [v2] = v;
       }
     }
   }
   return mst_edges;
 }

 int main (nulo) {
   fstream inFile;
   inFile.open ("temp.txt");
   int n, m;
   inFile >> n >> m;
   vvii G (n);

   int u, v, costo;
   while (inFile >> u >> v >> costo) {
     G [u-1] .push_back (ii (v-1, costo));
     G [v-1] .push_back (ii (u-1, costo));
   }

   cout << "Los bordes MST son" << endl;
   vii mst_edges = Prim_MST (G);
   tr (mst_edges, it) 
     cout < first + 1 << "," < second + 1 << endl;
 }

Use . Debajo del capó, es un árbol rojo-negro. Por lo tanto, le da inserciones, eliminaciones y búsquedas O (log). Use eso en lugar de una cola de prioridad ya que la cola de prioridad de C ++ no tiene una funcionalidad clave disminuida. Aquí hay un tutorial de donde aprendí:
Tutoriales de algoritmos

Y aquí está mi implementación de trabajo de C ++:

// Algoritmo de Prim
// Complejidad de tiempo: O ((V + E) logV) usando un conjunto de STL.

Editar: supongo que las etiquetas de vértice comienzan desde 0 y no desde 1.
Actualización: el código ha sido sangrado

 #include  #include  #include  #include  #define MAX 1e8 // número muy grande typedef vector  vi;  typedef pair  ii;  typedef vector  vii;  typedef vector  vvii;  usando el espacio de nombres estándar;  int main () {int V;  cin >> V; // Número de vértices vvii G (V); // El vector de gráfico ponderado no dirigido  disc (V, falso); // si el vértice se descubre o no vi d (V, MAX); // all d [] initialized vi par (V, -1); // parent of the vertex vii edge; // Los bordes del MST int E;  cout << "Bordes \ n";  cin >> E;  cout << "Ingrese cada borde \ n";  para (int i = 0; i > u;  cin >> v;  cin >> wt;  G [u] .push_back (make_pair (v, wt));  G [v] .push_back (make_pair (u, wt));} cout << "Elija el vértice de inicio de 0 a" << V-1 << endl;  int s;  cin >> s;  set  Q; // set es un RBT. Dado que se trata de un conjunto de pares. Un par (i, j)  cost) {Q.erase (Q.find (make_pair (d [v2], v2))) ;  d [v2] = costo;  Q.insert (make_pair (d [v2], v2));  par [v2] = v; // padre se actualizará en este bucle}}}} cout << "MST edge set is" << endl;  for (int i = 0; i