1. 程式人生 > >Prim 最小生成樹

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;
}