Prim算法

最小生成树问题一定是针对无向图,Prim算法适用于稠密图

存储结构采用邻接矩阵,n为顶点数,m为边数

int graph[n][n];

memset(graph, 0x3f, sizeof(graph));
for (int i = 0; i < n; i++) graph[i][i] = 0;

dis[i]标示顶点i到生成树的最短距离,以顶点0为开始构造生成树(初始化dis[0]0,其他为0x3f3f3f3f),vis[i]标示顶点i是否已在生成树中(0是未访问,1是已访问,初始化为全0

int dis[n], vis[n];

Prim算法流程如下:

(1)遍历所有未被访问的顶点jvis[j]0),找到其中距离生成树最近的顶点t(dis[t]为最短)

(2)标记t为已访问(vis[t]标记为1),用顶点t更新所有未访问顶点jdis[j](如果graph[t][j] < dis[j],则用graph[t][j]更新dis[j]

(3)循环1、2步n-1次(每次标记一个顶点已访问,除开始选取的顶点0一共n-1个顶点需要标记,所以循环n-1次)

for (int i = 1; i < n; i++) {
    int t = -1;
    for (int j = 0; j < n; j++)
        if (!vis[j] && (t == -1 || dis[j] < dis[t])) t = j;

    vis[t] = 1;
    for (int j = 0; j < n; j++)
        if (!vis[j]) dis[j] = min(dis[j], graph[t][j]);
}

算法结束时,dis[i]存储顶点i被加入生成树选出的最小边的权值,将所有顶点idis[i]相加得到最小生成树的边权和,若dis[i]0x3f3f3f3f则没有最小生成树