一、生成树
1. 连通图的生成树是包含图中全部顶点的一个极小连通子图,顶点数为n,则生成树的含有n-1条边
2. 最小生成树:设R为G的所有生成树的集合,若T为R中权值之和最小的生成树,则T称为G的最小生成树
二、Prim算法
1. 算法描述
从某个顶点开始构建生成树,每次将代价最小的新顶点纳入生成树中,直到所有顶点都纳入为止
2. 复杂度
时间复杂度,适合用于边稠密图
三、Kruskal算法
1. 算法描述
每次选择一条权值最小的边,使这条边的两头连通(原本已经连通的就不选),直到所有结点都连通
2. 复杂度
时间复杂度,适合用于边稀疏图
最短路径的两大问题
四、最短路径——广度优先算法(BFS)求无权图的单源最短路径
//求顶点u到其他顶点的最短路径
void BFS_MIN_Distance(Graph G,int u){
for(int i=0;i<G.vexnum;i++){
d[i]=INT_MAX; //初始化路径长度
path[i]=-1; //记录最短路径是从哪个顶点而来
visited[i]=false; //记录顶点是否被访问
}
d[u]=0;
visited[u]=true;
EnQueue(Q,u);
while(!isEmpty(Q)){
DeQueue(Q,w);
for(w=FirstNeighbor(Q,u);w>=0;w=NextNeighbor(Q,u,w)){
if(!visited[w]){
d[w]=d[u]+1;
path[w]=u;
visited[w]=true;
EnQueue(Q,w);
}
}
}
}
五、最短路径——迪杰斯特拉算法
1. BFS算法的局限性
BFS算法只适用于无权图
2. 算法描述
求v0到其他顶点的最短距离
① 从v0开始,初始化下列三个数组信息
② 循环遍历所有结点,找到还没确定最短路径且dist最小的顶点Vi,令final[i]=true
迪杰斯特拉算法不能解决带有负权值的路径
六、最短路径——Floyd算法(求解各顶点之间的最短路径)
1. 算法描述
动态规划思想,将问题的求解分为多个阶段
//核心代码
for(int k=0;k<n;k++){ //考虑以Vk作为中转点
for(int i=0;i<n;i++){ //遍历整个矩阵,i为行号,j为列号
for(int j=0;j<n;j++){
if(A[i][j]>A[i][k]+A[k][j]){ //以Vk为中转点的路径更短
A[i][j]=A[i][k]+A[k][j];
path[i][j]=k;
}
}
}
}
Floyd算法不能解决带有“负权回路” 的图