prime核心:找已知 起点 到 各个节点 的最小权,在其中找最小值,将点设为已访问,用该点进行搜索,更新未访问的点的权(最小),直到访问完所有点。
const int size=9;
const int MAX=1000000;
int map[size][size]={
{ 0,4,MAX,MAX,MAX,MAX,MAX,8,MAX },
{ 4,0,8,MAX,MAX,MAX,MAX,11,MAX },
{ MAX,8,0,7,MAX,4,MAX,MAX,2 },
{ MAX,MAX,7,0,9,14,MAX,MAX,MAX },
{ MAX,MAX,MAX,9,0,10,MAX,MAX,MAX },
{ MAX,MAX,4,14,10,0,2,MAX,MAX },
{ MAX,MAX,MAX,MAX,MAX,2,0,1,6 },
{ 8,11,MAX,MAX,MAX,MAX,1,0,7 },
{ MAX,MAX,2,MAX,MAX,MAX,6,7,0 }
};
int visit[size];
int mincost[size];
int father[size];
int root=0;
int minpath=0;
for(int i=0;i<size;i++){
mincost[i]=map[root][i];
visit[i]=0;
father[i]=0;
}
visit[root]=1;
int searchroot=root;
for(int i=1;i<size;i++){//起始点已访问
int minint=MAX;
for(int j=0;j<size;j++){
if((!visit[j])&&mincost[j]<minint){//找队列里的最小值做下一个顶点
minint=mincost[j];
searchroot=j;
}
}
minpath+=minint;
visit[searchroot]=1;
for(int j=0;j<size;j++){
if((!visit[j])&&mincost[j]>map[searchroot][j]){//找各个边的最小值更新最小权值
mincost[j]=map[searchroot][j];
father[j]=searchroot;
}
}
}
for(int i=1;i<size;i++){
int lo=i;
while(lo){
cout<<(char)(lo+'a')<<" <-- ";
lo=father[lo];
}
cout<<'a'<<endl;
}
cout<<"minimal path is "<<minpath<<endl;
核心:找已知的最小权