prim算法精讲
代码随想录
#include <iostream>
#include <vector>
#include <climits>
using namespace std;
int main() {
int n, m;
int a, b, s;
cin >> n >> m;
vector<vector<int>>grid(n + 1, vector<int>(n + 1, 10005));
while (m--) {
cin >> a >> b >> s;
grid[a][b] = s;
grid[b][a] = s;
}
vector<int>minDist(n + 1, 10005);//记录到最小生成树的最短距离
vector<int>isInTree(n + 1, false);//记录是否在最小生成树里面
for (int i = 1; i < n; i++) {
int minVal = INT_MAX;//记录当前到最小生成树的最短距离
int node = -1;//记录最小的节点
for (int j = 1; j <= n; j++) {
if (!isInTree[j] && minVal > minDist[j]) {
minVal = minDist[j];
node = j;
}
}
isInTree[node] = true;//加入到最小生成树里面
for (int j = 1; j <= n; j++) {//重新遍历离最小生成树最小的距离的节点
if (!isInTree[j] && minDist[j] > grid[node][j]) {
minDist[j] = grid[node][j];
}
}
}
int res = 0;
for (int i = 2; i <= n; i++) {//这里不遍历1节点
res += minDist[i];
}
cout << res << endl;
}
kruskal算法精讲
代码随想录
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct Edge {
int x, y, val;
};
const int N = 10005;
vector<int>father(N);
int res = 0;
int n, m;
int v1, v2, val;
void init() {
for (int i = 0; i < n; i++) {
father[i] = i;
}
}
int find(int v) {
return father[v] == v ? v : father[v] = find(father[v]);
}
void join(int v, int u) {
u = find(u);
v = find(v);
if (u == v)return;
father[u] = v;
}
bool compareVal(Edge& a, Edge& b) {
return a.val < b.val;
}
void solve() {
vector<Edge>edges;
while (m--) {
cin >> v1 >> v2 >> val;
edges.push_back({ v1,v2,val });
}
sort(edges.begin(), edges.end(), compareVal);
for (Edge edge:edges) {
int v = find(edge.x);
int u = find(edge.y);
if (v != u) {
res += edge.val;
join(edge.x, edge.y);
}
}
cout << res << endl;
}
int main() {
cin >> n >> m;
init();
solve();
return 0;
}