1问题
Prim算法和Kruskal算法构造最小生成树的过程和算法实现
2解析
Prim:在一个加权连通图中,选取一个起始点,在所有相邻点中选取一个权值最小的点与起始点构成点集,在不形成环的情况下重复上述操作,使所有点进入该点集,形成Prim最小生成树。
Kruskal:在一个加权连通图中,Graph[v]是该图的加权边集,循环:从该集合中最小的权值边开始遍历,直到每个顶点都在同一连通分量中(if 一条边的两个顶点不在同一连通分量中,就添加该边到E[new]中),E[new]以边集的形式输出Kruskal法最小生成树。
3设计
Int Prime(int start){
Visit[start]=1;
For(i from 1 to vmax){
For(j from 1 to vmax)
Visit[i]=0;
Dist[i][j]=graph[i][j];
( * Dist[i][i]=INF)
}
While[visitnum<Vnum]{
For(i from1 to Vmax){
For(j from 1 to Vmax){
If(visit[i]==true && visit[j]==false && Graph[i][j]<dist)
更新 dist[i][j] 和 pos[i] pos[j];
}
}
Visit[pos[j]]=true;
Visitnum++;
Path+=dist[i][i];
Mp[][]记录distp[i][j];
}
}
bool is-same-set(){}判断两个点是否为同一连通分量
int set(){}查询根节点
void merge_in_same_set(){}将两个点归为同一连通分量
int Kruskal(){
判断结构体数组中 i 和 j是否在同一连通分量,是的话不加入sum,不是的话加入
}
4分析
Prim:
While{
For(){
For(){
}
}
}
时间复杂度O(n^3) 空间复杂度O(1)
Kruskal:
时间复杂度:O(n^2) 空间复杂度O(1)
5源码
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<queue>
#define v 4
int set[v];
int mp[v][v] = {
0 };
int Graph[v][v];
bool visit[v] = {
false};
struct road {
int i;
int j;
int w;
}r[4];
void Prim(int Graph[]