prim算法构造最小生成树

假设G=(V,E)是连通的,TE是G上最小生成树中边的集合。算法从U={u0}(u0∈V)、TE={}开始。重复执行下列操作:
在所有u∈U,v∈V-U的边(u,v)∈E中找一条权值最小的边(u0,v0)并入集合TE中,同时v0并入U,直到V=U为止。
此时,TE中必有n-1条边,T=(V,TE)为G的最小生成树。
例:
prim算法构造最小生成树_第1张图片
假设从v1开始,找到最小边v1 v3
prim算法构造最小生成树_第2张图片
在v1和v3的相邻边找到权重最小边v3-v6
prim算法构造最小生成树_第3张图片
在v1和v3和v6的相邻边找到权重最小边v6-v4
prim算法构造最小生成树_第4张图片
继续找找到v2

prim算法构造最小生成树_第5张图片
最后到达v5
prim算法构造最小生成树_第6张图片

#include 
#include 
#include 
#include 
using namespace std;
const int maxn=1005;
const int INF=0x3f3f3f3f;
int p[maxn]; //储存父节点
int edge[maxn][maxn];//邻接矩阵
int d[maxn]; //到生成树的最短距离
int vis[maxn];//是否加入集合中
int n,m;
//初始化
void init()
{
    memset (vis,0,sizeof(vis));
    memset (p,-1,sizeof(p));
    for (int i=1;i<=n;i++)
        for (int j=1;j<=n;j++)
             i==j? edge[i][j]==0:edge[i][j]=INF;
}
void prim()
{
    //以1作为根节点
    for (int i=1;i<=n;i++)
    {
        if(edge[1][i]!=INF)
            p[i]=1;
        d[i]=edge[1][i];
    }
    while (1)
    {
        int maxx=INF;
        int u=-1;
        //找到距离生成树最短距离的节点
        for (int i=1;i<=n;i++)
        {
            if(!vis[i]&&d[i]<maxx)
            {
                maxx=d[i];
                u=i;
            }
        }
        if(u==-1)
            break;
        //将选出的节点纳入集合
        vis[u]=1;
        //更新该节点影响的节点
        for (int i=1;i<=n;i++)
        {
            if(!vis[i]&&d[i]>edge[u][i])
            {
                d[i]=edge[u][i];
                p[i]=u;
            }
        }
    }
    int sum=0;
    for (int i=1;i<=n;i++)
        if(p[i]==-1)
        {
            printf("不存在最小生成树\n");
            return ;
        }
        else
            sum+=d[i];
        printf("最短生成树的长度为%d\n",sum);
        return ;
}
void parent ()
{
    for (int i=1;i<=n;i++)
        if(p[i]!=-1&&p[i]==i)
              printf("%d为根节点\n",i);
        else if(p[i]!=-1)
              printf("%d的父节点为%d\n",i,p[i]);
}
int main()
{
    scanf("%d%d",&n,&m);
    init();
    for (int i=1;i<=m;i++)
    {
        int x,y,sp;
        scanf("%d%d%d",&x,&y,&sp);
        edge[x][y]=edge[y][x]=sp;
    }
    prim();
    parent();
    return 0;
}

你可能感兴趣的:(prim算法构造最小生成树)