蚌埠公司做网站,最新域名查询访问,大连建设工程招标信息网官网,青岛做网站多少钱目录 1 基础知识2 模板3 工程化 1 基础知识
朴素版prim算法的关键步骤#xff1a;
初始化距离数组dist#xff0c;将其内的所有元素都设为正无穷大。定义集合S#xff0c;表示生成树。循环n次#xff1a;找到不在集合S中且距离集合S最近的结点t#xff0c;用它去更新剩余… 目录 1 基础知识2 模板3 工程化 1 基础知识
朴素版prim算法的关键步骤
初始化距离数组dist将其内的所有元素都设为正无穷大。定义集合S表示生成树。循环n次找到不在集合S中且距离集合S最近的结点t用它去更新剩余结点到集合S的距离。最小生成树建立完毕边长之和等于每次的d[t]之和。
朴素版prim算法的时间复杂度为O(n^2)它用来解决稠密图的最小生成树问题。
2 模板
int n; // n表示点数
int g[N][N]; // 邻接矩阵存储所有边
int dist[N]; // 存储其他点到当前最小生成树的距离
bool st[N]; // 存储每个点是否已经在生成树中// 如果图不连通则返回INF(值是0x3f3f3f3f), 否则返回最小生成树的树边权重之和
int prim()
{memset(dist, 0x3f, sizeof dist);int res 0;for (int i 0; i n; i ){int t -1;for (int j 1; j n; j )if (!st[j] (t -1 || dist[t] dist[j]))t j;if (i dist[t] INF) return INF;if (i) res dist[t];st[t] true;for (int j 1; j n; j ) dist[j] min(dist[j], g[t][j]);}return res;
}3 工程化
题目1求最小生成树。
#include iostream
#include cstringusing namespace std;const int N 510;
int g[N][N];
int d[N];
bool st[N];
int n, m;void prim() {memset(d, 0x3f, sizeof d);int res 0;for (int i 0; i n; i) {//n次循环//找到不在集合S且距离集合S最小的结点int t -1;for (int j 1; j n; j) {if (!st[j] (t -1 || d[t] d[j])) {t j;}}if (i d[t] 0x3f3f3f3f) {cout impossible endl;return;}st[t] true;if (i) res d[t];//用t去更新其它结点for (int j 1; j n; j) {if (d[j] g[t][j]) {d[j] g[t][j];}}}cout res endl;return;
}int main() {cin n m;memset(g, 0x3f, sizeof g);int a, b, c;while (m--) {cin a b c;g[a][b] min(g[a][b], c);g[b][a] min(g[b][a], c);}prim();return 0;
}