Prim算法
void Prim(int start){//从start顶点开始
int i,j,k;
int min,sweight[max];//sweight数组标记是否在最小生成树中,为0,则是
for(i=0;i<max;i++){
sweight[i]=weight[start][i];//初始化
edge[i]=start;//标记边(start,i)在最小生成树中
}
sweight[start]=0;//标记start顶点已经在最小生成树中
for(i=0;i<max-1;i++){//max-1次循环,每次循环找到一个顶点
min=infinity;
for(j=0,k=0;j<max-1;j++){
if(sweight[j]==0&&min>sweight[j]){
min=sweight[j];//找到尚未在最小生成树中的顶点中距离最小的顶点
k=j;
}
}
sweight[k]=0;//找到之后标记在最小生成树中
for(j=0;j<max;j++){
if(sweight[j]==0&&sweight[j]>weight[k][j]){
sweight[j]=weight[k][j];//更新不在最小生成树中的顶点到最小生成树的最小距离
edge[j]=k;//标记边(k,j)
}
}
}
}
Dijkstra算法
void Dijkstra(int start){//start为起点
int sweight[max],wfound[max]={0};//wfound数组标记是否找到最短路径,为1,则是
int spath[max];//记录路径
int i,j,k=0;
for(i=0;i<max;i++){
sweight[i]=weight[start][i];//初始化
spath[i]=start;
}
wfound[start]=1;//标记start点已找到
sweight[start]=0;//在最短路径中,则sweight为0
for(i=0;i<max-1;i++){//max-1次循环
int min=infinity;
for(j=0,k=0;j<max;j++){
if(sweight[j]<min&&wfound[j]==0){
min=sweight[j];//找到不在最短路径中的最小值
k=j;
}
}
wfound[k]=1;//标记找到
sweight[k]=0;//标记找到
for(j=0;j<max;j++){
if(wfound[j]==0&&sweight[j]>weight[j][k]+min){
sweight[j]=min+weight[j][k];//添加k定点后更新距离
spath[j]=k;//更新路径
}
}
}
}