最小生成树
Prim
struct Node {
int y, v;
Node(int _y, int _v) { y = _y, v = _v; }
};
vector<Node>edge[1010];
int n, m, dis[1010];
bool b[1010];
int Prim() {
memset(b, false, sizeof(b));
memset(dis, 127, sizeof(dis));
dis[1] = 0;//任意设一个起点开始找最短路
int ans = 0;
for (int i = 1; i <= n; i++) {
int x = -1;
for (int j = 1; j <= n; j++) {
if (!b[j] && dis[j] < 1 << 30) {
if (x == -1 || dis[j] < dis[x])
x = j;
}
}
b[x] = true;
ans += dis[x];
for (auto j : edge[x]) {
dis[j.y] = min(dis[j.y], j.v);
}
}
return ans;
}
void solve() {
scanf("%d%d", &n, &m);
for (int i = 1; i <= m; i++) {
int x, y, z;
scanf("%d%d%d", &x, &y, &z);
edge[x].push_back({ y,z });
edge[y].push_back({ x,z });
}
int ans=Prim();
printf("%d\n", ans);
}Kruskal
Last updated