#define MAX 1<<20
#define M 1005
int lowcost[M];//当前生成树u的集合到其他各顶点的边最短的集合
//lowcost初始为出发点到其他点的距离,不断更新为二叉树
int vis[M];//标记节点是否进入生成树,1为进入,0为无
struct stu
{
int N;//顶点个数
int e;//边的个数
int map[M][M];//基础输入
};
void init(stu R)//初始化数组
{
for(int i=0;i<R.N;i++)
{
for(int j=0;j<R.N;j++)
{
R.map[i][j]=0;
}
}
}
void prim(stu R,int v)//v为出发点,此处的prim算法类似于打表
{
for(int i=0;i<R.N;i++)
{
lowcost[i]=R.map[v][i];//记录起点v距离其他点的距离
vis[i]=0;//初始化所有的点都没有进入二叉树
}
vis[v]=1;//很明显v进入二叉树,所以进行标记
int sum=0;//记录最短路长度,最短路数据存在lowlost数组里
int k;
int min;
for(int i=0;i<R.N;i++)
{
min=MAX;//初始为最大值
for(int j=0;j<R.N;j++)
{
if(vis[j]==0&&lowcost[j]<min)
{
min=lowcost[j];
k=j;
}
}//不断循环,知道发现与v相连的最小边,计入最短路
vis[k]=1;
v=k;//此时将v更新为k,查找k的最近边
sum+=min;
/*开始更新lowcost的数值,如果vis[j]==0;
说明已经在此之前已经两个顶点已经联通,
所以只遍历与出发点同属并查集但并未初始相连的点*/
for(int j=0;j<R.N;j++)
{
if(vis[j]==0&&R.map[v][j]<lowcost[j])/*此处v已经更新为新的节点
所以将其关联点距离与出发点距离各顶点做对比*/
{
lowcost[j]=R.map[v][j];
}
}
}
}
最小生成树Prim算法
最新推荐文章于 2019-05-15 17:08:57 发布