通常采用迪杰斯特拉算法来求某一顶点到其余顶点的最小距离。
引入了三个数组,dist[],path[],set[].
其中dist[]数组是用来存放当前状态下,到该节点的额最小权值。path[]数组是存储了当前结点所连接的前一个结点,也就是记录了当前的路径。而set[]数组是分别有0,1两个值,其中0代表该节点未被并入树中,而1代表该节点已经被并入树中。以下是具体的代码:
void Dijkstra(Graph g,int v,int dist[],int path[]){
for(int i=0;i<g.n;i++){
dist[i]=g.edgse[v][i]//对数组进行准备工作
}
for(int i=0;i<g.n;i++){//数组的初始化操作
dist[i]=g.edgse[v][i];
set[i]=0;
if(g.edgse[v][i]<INF){
path[i]=v;
}
else{
path[i]=-1;
}
}
set[v]=1;//已被利用过
path[v]=-1;//代表其没有父结点
int min =INF;
int k;
for(int i=0;i<g.m;i++){
for(int w=0;w<g.n;w++){
if(set[w]==0&&dist[w]<INF){
min=dist[i];
k=j;
}//从中遴选出一个顶点,使通往该结点的路径是通往其余的结点路径中最小的
}
for(int h=0;h<g.n;h++){
if(set[h]==0&dist[h]>dist[k]+g.edges[k][h])
dist[h]=dist[k]+g.edges[k][h];//对dist[]数组进行更新
path[h]=k; //保存路径
}
}
}
以下是打印路径的函数:
void printpath(int path[],int v,int v0){
int stack[maxn];
int top=-1;
while(path[v]!=-1){
v=path[v];
stack[++top]=v;
}
while(top!=-1){
cout << stack[top] << " ";
top--;
}
}
普里姆算法与迪杰斯特拉算法的区别,首先普里姆算法是考虑最小代价树,也就是说每一步考虑树的整体到下一个结点的最小权值,而迪杰斯特拉算法是考虑下一个结点到初始结点的最小权值,中间可能横跨了好几个结点。