普利姆思想:先选中一个结点为一个整体,在剩下所有结点与该整体的所有边中选一条最短的边,将这条新出现边的一个顶点归入这个整体中,然后在新合成的整体与剩下的所有结点的所有边中选一条最短的边,将这条新出现边的一个顶点归入这个整体中,以此类推,直到所有结点遍历完。
举个实例,首先这是一个初始图表,如下所示:
第一步:我们先随机找一个基本点(例如1),然后分别列出该点到各边的距离,如下:
然后在上图中提出边长最短的一条1–>2,接下来以(1,2)为一个基本查找点,列出所有与(1,2)相关的边。
接下来,在边长为2,3,5,6间找出边长最短的边2,对应(1,3)两顶点,即将顶点3归入(1,2)内,然后(1,2,3)就变成了一个整体
最后,在边长为5,6,+&间找出最短的边5,对应(1,4)两顶点,将顶点4归入(1,2,3)中得到(1,2,3,4),即所有的点遍历完全,算法结束。
接下来代码代码演示
int visit[max];
int road[max];
int cog[max];
int j;
typedef struct AG
{
int g[maxize][maxsize] //存储两个顶点及其相应的边长
int n; //存储图的结点总数
int d; //存储图的边数
}AG;
void MG(AG a,int i){
int u;
for(u=0;u<a.n,u++)
{
visit[u]=0; //将每个结点做好唯一标志
}
for(u=1;u<=a.d;u++)
{
if(i!=u)
cog[u]=a.g[i][u];//先把这个点与各个点连接的距离记下来
}
j=0;
visit[i]=1;road[j]=i;
while(j!=a.n-1)
{
for(k=0;k<a.n;k++)
if(visit[k]==0)
{
if(a.g[j][k]<cog[k])//重新将剩余各点最小的点进行排序
cog[k]=a.g[j][k];
if(term>cog[k]) //取剩下边中最小的一条边
{
term=cog[k];
z=k;
}
}
visit[z]=1;
term=N;
road[++j]=z;
}
}