最小生成树Prim算法

来源:互联网 发布:小企业的会计软件 编辑:程序博客网 时间:2024/06/07 01:29
#define MAX 1<<20#define M 1005int 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];            }        }    }}

原创粉丝点击