1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
| #include <bits/stdc++.h> using namespace std;
vector<vector<int>> Kruskal(vector<vector<int>> adjMat) { vector<int> dsu(adjMat.size(), -1); for (size_t i = 0; i < dsu.size(); i++) { dsu[i] = i; } const function<int(int)> find = [&](int x) { return dsu[x] = dsu[x] == x ? x : find(dsu[x]); }; const auto merge = [&](int x, int y) { dsu[find(x)] = dsu[find(y)]; }; int sumOfweights = 0; vector<vector<int>> MSTMat(adjMat.size(), vector<int>(adjMat.size(), 0)); for (size_t i = 0; i < adjMat.size() - 1; i++) { int minu = 0, minv = 0, minw = INT_MAX; for (size_t u = 0; u < adjMat.size(); u++) for (size_t v = 0; v < adjMat.size(); v++) { if (adjMat[u][v] && minw > adjMat[u][v] && find(u) != find(v)) { minw = adjMat[u][v]; minu = u; minv = v; } } cout << i + 1 << " " << (char)('a' + minu) << " " << (char)('a' + minv) << " " << minw << endl; merge(minu, minv); MSTMat[minu][minv] = MSTMat[minv][minu] = minw; adjMat[minu][minv] = adjMat[minv][minu] = 0; sumOfweights += minw; } cout << "Sum of Weights: " << sumOfweights << endl; return MSTMat; }
vector<vector<int>> Prim(vector<vector<int>> adjMat) { vector<int> dsu(adjMat.size(), -1); for (size_t i = 0; i < dsu.size(); i++) { dsu[i] = i; } const function<int(int)> find = [&](int x) { return dsu[x] = dsu[x] == x ? x : find(dsu[x]); }; const auto merge = [&](int x, int y) { dsu[find(x)] = dsu[find(y)]; }; int sumOfweights = 0; vector<vector<int>> MSTMat(adjMat.size(), vector<int>(adjMat.size(), 0)); vector<bool> vis(adjMat.size(), false); bool flag = false; for (size_t i = 0; i < adjMat.size() - 1; i++) { int minu = 0, minv = 0, minw = INT_MAX; for (size_t u = 0; u < adjMat.size(); u++) for (size_t v = 0; v < adjMat.size(); v++) { if (adjMat[u][v] && minw > adjMat[u][v] && (!flag || (vis[u] && !vis[v]) || (vis[v] && !vis[u]))) { flag = true; minw = adjMat[u][v]; minu = u; minv = v; } } cout << i + 1 << " " << (char)('a' + minu) << " " << (char)('a' + minv) << " " << minw << endl; vis[minu] = vis[minv] = true; merge(minu, minv); MSTMat[minu][minv] = MSTMat[minv][minu] = minw; adjMat[minu][minv] = adjMat[minv][minu] = 0; sumOfweights += minw; } cout << "Sum of Weights: " << sumOfweights << endl; return MSTMat; }
int main() { vector<vector<int>> adjMat = { {0, 2, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0}, {2, 0, 3, 0, 0, 1, 0, 0, 0, 0, 0, 0}, {0, 3, 0, 1, 0, 0, 2, 0, 0, 0, 0, 0}, {0, 0, 1, 0, 0, 0, 0, 5, 0, 0, 0, 0}, {3, 0, 0, 0, 0, 4, 0, 0, 4, 0, 0, 0}, {0, 1, 0, 0, 4, 0, 3, 0, 0, 2, 0, 0}, {0, 0, 2, 0, 0, 3, 0, 3, 0, 0, 4, 0}, {0, 0, 0, 5, 0, 0, 3, 0, 0, 0, 0, 3}, {0, 0, 0, 0, 4, 0, 0, 0, 0, 3, 0, 0}, {0, 0, 0, 0, 0, 2, 0, 0, 3, 0, 3, 0}, {0, 0, 0, 0, 0, 0, 4, 0, 0, 3, 0, 1}, {0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 1, 0}, }; auto MSTMat = Prim(adjMat); cout << "Prim:" << endl; cout << " a b c d e f g h i j k l" << endl; for (size_t u = 0; u < MSTMat.size(); u++) { cout << (char)('a' + u) << " "; for (size_t v = 0; v < MSTMat.size(); v++) cout << MSTMat[u][v] << " "; cout << endl; } MSTMat = Kruskal(adjMat); cout << "Kruskal:" << endl; cout << " a b c d e f g h i j k l" << endl; for (size_t u = 0; u < MSTMat.size(); u++) { cout << (char)('a' + u) << " "; for (size_t v = 0; v < MSTMat.size(); v++) cout << MSTMat[u][v] << " "; cout << endl; } return 0; }
|