使用prim算法和kruskal算法求下图的最小生成树
使用dijstra算法求下图的所有顶点对之间的最短路径
均需按边选择的顺序输出被选出的边图中有顶点{v0,v1,v2,v3,v4,v5}
有下面的边
(v0 v1 34 )
(v0 v2 46 )
(v0 v5 19 )
(v1 v4 12 )
(v2 v3 17 )
(v2 v5 25 )
(v3 v4 38 )
(v3 v5 25 )
(v4 v5 26 )
kruskal算法
#include<iostream>
#define N 6
#define B 9
using namespace std;
struct Edge{
int begin;
int end;
int weight;
};
//邻接表,权值从小到大排序
Edge edge[B]={ {1,4,12},{2,3,17},{0,5,19},
{2,5,25},{3,5,25},{4,5,26},
{0,1,34},{3,4,38},{0,2,46} };
int parent[N-1];//各顶点根节点
int find(int n){//返回n的根节点
while(parent[n]>0){
n=parent[n];
}
return n;
}
void kruskal(){
int choose=0;
for(int i=0;i<B&&choose<N-1;i++){//遍历所有边
int n=find(edge[i].begin);//找根节点
int m=find(edge[i].end);//找根节点
if(n!=m){//根节点不相同,把一个当孩子节点
parent[n]=m;//更新根节点
choose++;
cout<<edge[i].begin<<"->"<<edge[i].end<<":"<<edge[i].weight<<endl;//输出以选边
}
}
if(choose<N-1)
printf("图不连通没有最小生成树!\n");
}
int main(){
kruskal();
}
prim算法:
#include<iostream>
#define N 6
#define M 65535
using namespace std;
//邻接矩阵
int bian[N][N]={ {0,34,46,M,M,19},
{34,0,M,M,12,M},
{46,M,0,17,M,25},
{M,M,17,0,38,25},
{M,12,M,38,0,26},
{19,M,25,25,26,0} };
int nowBianJH[N];//存储当前点到各点的最短距离
int minDianJH[N];//存储到达最短距离坐标
void prim(int n){
for(int i=0;i<N;i++){//初始化当前点的数据
nowBianJH[i]=bian[n][i];
minDianJH[i]=n;
}
for(int i=1;i<N;i++){//找其他N-1个点的数据
int min=M,min_i=-1;
for(int j=0;j<N;j++){
if(nowBianJH[j]!=0&&nowBianJH[j]<min){//假如有更短距离
min=nowBianJH[j];//更新距离
min_i=j;//更新下一个节点
}
}
cout<<minDianJH[min_i]<<"->"<<min_i<<":"<<min<<endl;//输出找到的最短长度
nowBianJH[min_i]=0;//无须再寻找min_i位置距离,置为0判断跳过
for(int k=0;k<N;k++){//更新新节点带来的数据
if(nowBianJH[k]!=0&&bian[min_i][k]<nowBianJH[k]){
nowBianJH[k]=bian[min_i][k];//更新更短距离
minDianJH[k]=min_i;//更新到达距离的坐标
}
}
}
}
int main(){
prim(2);
}
dijstra算法:
#include<iostream>
#define N 6
#define M 65535
using namespace std;
//邻接矩阵
int bian[N][N]={ {0,34,46,M,M,19},
{34,0,M,M,12,M},
{46,M,0,17,M,25},
{M,M,17,0,38,25},
{M,12,M,38,0,26},
{19,M,25,25,26,0} };
int nowBianJH[N];//存储当前点到各点的最短距离
int minDianJH[N];//存储到达最短距离坐标
int tag[N];//标记点是否已经找过
void trackPath(int n){
for(int i=0;i<N;i++){
int k=i;
cout<<n<<"->";
while(minDianJH[k]!=n){
cout<<minDianJH[k]<<"->";
k=minDianJH[k];
}
cout<<i<<":"<<nowBianJH[i]<<endl;
}
}
void dijkstra(int n){
tag[n]=1;
for(int i=0;i<N;i++){//初始化当前点的数据
nowBianJH[i]=bian[n][i];
minDianJH[i]=n;
}
for(int i=1;i<N;i++){//找其他N-1个点的数据
int min=M,min_i=-1;
for(int j=0;j<N;j++){
if(tag[j]!=1&&nowBianJH[j]<min){//假如有更短距离
min=nowBianJH[j];//更新距离
min_i=j;//更新下一个节点
}
}
tag[min_i]=1;//标记min_i点已经找过,置为1判断跳过
for(int k=0;k<N;k++){//更新新节点带来的数据
if(tag[k]!=1&&bian[min_i][k]+min<nowBianJH[k]){
nowBianJH[k]=bian[min_i][k]+min;//更新更短距离
minDianJH[k]=min_i;//更新到达距离的坐标
}
}
}
trackPath(n);
}
int main(){
dijkstra(5);
}