prime O(n^2)
从一点开始选择距离最小的点扩大集合U至整个图G,维护距离数组表示未加入集合的点到集合的最小距离
/*
d[N]距离数组
vis[N]是否加入集合
*/
d[1] = 0;//从点1开始
int ans = 0;
int flag = 1;//图是否联通
for (int i = 0; i < n; i++) {
int target = 0;
for (int j = 1; j <= n; j++) {//找到距离最小的未加入集合的点
if ((vis[j] == 0) && (target == 0 || d[target] > d[j])) {
target = j;
}
}
if (target == 0||d[target]>0x3f3f/2) {
flag = 0;
break;
}
else {
ans += d[target];
vis[target] = 1;
for (auto link : e[target]) {//松弛操作 维护数组
int v = link.first;
int w = link.second;
if (d[v] > w)d[v] = w;
}
}
}
kruskal O(mlogm)
for (int i = 1; i <= n; i++) {
fa[i] = i;
}
for (int i = 0; i < m; i++) {
int a1, a2, ww;
cin >> a1 >> a2 >> ww;
edge* curr = new edge;
curr->a = a1;
curr->b = a2;
curr->w = ww;
q.push(curr);
}
int ans = 0;
int flagfin = 1;
while (!q.empty()&&flagfin!=n) {
edge* e = q.top();
q.pop();
int n1 = e->a;
int n2 = e->b;
if (find(n1) == find(n2))continue;
ans += e->w;
fa[find(n1)] = find(n2);
flagfin++;
}
浙公网安备 33010602011771号