一:普利姆(prim)算法
对于临界矩阵表示的图,时间复杂度为O(|V|2)
对于邻接表表示的图,时间复杂度为O(|V|+|E|)
代码:
int dist[];//用来记录从原点到各个节点的距离
bool book[];//用来记录该节点是否被访问
void prim(){
dist[1] = 0;//从源节点到自己节点的距离为零
book[1] = true;//源 i++){
dist[i] = min(dist[i], G[1][i]);//找到源节点到相邻节点的距离值,并写入dist[i]
for(int i=2; i<=n;i++){
int temp = INF;//定义一个无穷大参数
int t=-1;//t记录新加入节点的偏移量
for(int j=2; j<=n; j++){
if(!book[j]&&dist[j]<temp){
temp = dist[j];
t = j;
}
if(t == -1){
return 0;
}
else{
book[t] = true;
res+=dist[t];
for(int j=2;j<=n; j++){
dist[j] = min(dist[j],G[t][j]);//更新dist[]中的值,只需要遍历新加入的节点到各个节点的距离即可
}
}
}
}
}
二: 迪杰斯特拉(dijestella)算法
迪杰斯特拉算法是用来寻找节点之间的最短路径的,所及基本代码思想与prim算法相似
代码:
int dist[];//记录各个节点到源节点的距离
boolen book[];
void djk(){
dist[1]=0;//源到自己的距离是0
book[1]=true;
for(int i=2; i<=n; i++){
dist[i] = G[1][i];
}
for(int i=2; i<=n; i++){
int temp = INF;//无穷大
int i = -1;
for(int j=2; j<=n;j++){
if(!book[j]&&dist[j]<temp){
temp = dist[j];
t = j;
}
}
if (t = -1){
return 0;
}
book[t] = true;
res = res+dist[j];
for(int j = 2; j<=n; j++){
dist[j] = min(dist[j],G[t][j]+dist[j]);//与prim算法不同之处
}
}
}