Prim 最小生成树

转:https://blog.csdn.net/zguiz/article/details/54633115

#include<stdio.h>
#include<string.h>
using namespace std;

#define MAX_VERTEX_NUM 20
#define MAX_INT 999
#define ERROR -1
#define OK 1

struct node
{
    int adjvex;
    int lowcost;
}closedge[MAX_VERTEX_NUM]; //辅助数组

typedef struct
{
    int vex[MAX_VERTEX_NUM];  //图的节点
    int arc[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; //图的矩阵 每条边的权
    int vexnum,arcnum;
}MGraph;                  //图的信息

int Locate(MGraph *G,int a) //定位
{
    for(int i=0;i<G->vexnum;i++)
    {
        if(a==G->vex[i])
            return i;
    }
    return ERROR;
}

int CreateUDN(MGraph *G)
{
    printf("请输入顶点数和边数: \n");
    scanf("%d%d",&G->vexnum,&G->arcnum);

    printf("请输入具体的顶点值: \n");
    for(int i=0;i<G->vexnum;i++)
    {
        scanf("%d",&G->vex[i]);
    }

    for(int i=0;i<G->vexnum;i++)
    {
        for(int j=0;j<G->vexnum;j++)
        {
            G->arc[i][j]=MAX_INT;    //矩阵的初始化
        }
    }

    printf("请输入各边的两个顶点以及边的权: \n");
    for(int i=0;i<G->arcnum;i++)
    {
        int v1,v2;
        int w;
        scanf("%d%d%d",&v1,&v2,&w);

        int n,m;
        n=Locate(G,v1);
        m=Locate(G,v2);

        G->arc[n][m]=w;
        G->arc[m][n]=G->arc[n][m]; //矩阵的赋值 每条边的权赋值
    }
    return OK;
}

int minimum(MGraph G) //查找数组里最小的权
{
    int Min=MAX_INT;
    int index=-1;
    for(int i=0;i<G.vexnum;i++)
    {
        if(Min>closedge[i].lowcost&&closedge[i].lowcost!=0)
        {
            Min = closedge[i].lowcost;
            index = i;
        }
    }
    return index;
}

void MiniSpanTree(MGraph G,int u)
{
    int k=Locate(&G,u);

    for(int i=0;i<G.vexnum;i++)
    {
        if(i!=k)
        closedge[i].adjvex=u;
        closedge[i].lowcost=G.arc[k][i];
    }

    closedge[k].lowcost=0; //新顶点入 U
    for(int i=1;i<G.vexnum;i++)
    {
        k=minimum(G);

        printf("%d -> %d\n",closedge[k].adjvex,G.vex[k]);
        closedge[k].lowcost = 0; //新顶点入 U
        for(int j=0;j<G.vexnum;j++)
        {
            if(G.arc[k][j]<closedge[j].lowcost)
            {
                closedge[j].adjvex = G.vex[k];
                closedge[j].lowcost = G.arc[k][j];
            }
        }
    }
}

int main()
{
    MGraph(G);
    CreateUDN(&G);
    MiniSpanTree(G,1);
    printf("\n");
    return 0;
}


猜你喜欢

转载自blog.csdn.net/LaoXiangQ/article/details/83419925