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; }