初学数据结构(最小生成树)

初学数据结构(最小生成树)

《数据结构教程》第6版,P308

prim算法(exp8-5)

//
// Created by Snow on 2023/4/23.
//
#include"graph.cpp"
void Prim(MatGraph g,int v)
{
    int lowcost[MAXV];
    int mindist;
    int closest[MAXV],i,j,k;
    for(i=0;i<g.n;i++)
    {
        lowcost[i]=g.edges[v][i];
        closest[i]=v;
    }
    for(i=1;i<g.n;i++)
    {
        mindist=INF;
        for(j=0;j<g.n;j++)
        {
            if(lowcost[j]!=0&&lowcost[j]<mindist)
            {
                mindist=lowcost[j];
                k=j;
            }
        }
        printf("边(%d,%d)权为:%d\n",closest[k],k,mindist);
        lowcost[k]=0;
        for(j=0;j<g.n;j++)
        {
            if(lowcost[j]!=0&&g.edges[k][j]<lowcost[j])
            {
                lowcost[j]=g.edges[k][j];
                closest[j]=k;
            }
        }
    }
}
int main()
{
    MatGraph g;
    int A[MAXV][MAXV]={
            {0,5,8,7,INF,3},
            {5,0,4,INF,INF,INF},
            {8,4,0,5,INF,9},
            {7,INF,5,0,5,6},
            {INF,INF,INF,5,0,1},
            {3,INF,9,6,1,0}};
    int n=6, e=9;
    CreateMat(g,A,n,e);
    printf("输出邻接矩阵G:\n");
    DispMat(g);
    int v=0;
    printf("从顶点%d开始的最小生成树为:\n",v);
    Prim(g,v);
    return 0;
}

Kruskal算法(exp8-6)

//
// Created by Snow on 2023/4/23.
//
#include"graph.cpp"
#define MaxSize 100
typedef struct
{
    int u;
    int v;
    int w;
}Edge;
//插入排序
void InsertSort(Edge E[],int n)
{
    int i,j;
    Edge temp;
    for(i=0;i<n;i++)
    {
        temp=E[i];
        j=i-1;
        while(j>=0&&temp.w<E[j].w)
        {
            E[j+1]=E[j];
            j--;
        }
        E[j+1]=temp;
    }
}
void Kruskal(MatGraph g)
{
    int i,j,u1,v1,sn1,sn2,k;
    int vest[MAXV];
    Edge E[MaxSize];
    k=0;
    for(i=0;i<g.n;i++)
        for(j=0;j<g.n;j++)
            if(g.edges[i][j]!=0&&g.edges[i][j]!=INF)
            {
                E[k].u=i;
                E[k].v=j;
                E[k].w=g.edges[i][j];
                k++;
            }
    InsertSort(E,g.e);
    for(i=0;i<g.n;i++)
        vest[i]=i;
    k=1;
    j=0;
    while(k<g.n)
    {
        u1=E[j].u;
        v1=E[j].v;
        sn1=vest[u1];
        sn2=vest[v1];
        if(sn1!=sn2)
        {
            printf("(%d,%d):%d\n",u1,v1,E[j].w);
            k++;
            for(i=0;i<g.n;i++)
            {
                if(vest[i]==sn2)
                    vest[i]=sn1;
            }
        }
        j++;
    }
}
int main()
{
    MatGraph g;
    int A[MAXV][MAXV]={
            {0,5,8,7,INF,3},
            {5,0,4,INF,INF,INF},
            {8,4,0,5,INF,9},
            {7,INF,5,0,5,6},
            {INF,INF,INF,5,0,1},
            {3,INF,9,6,1,0}};
    int n=6, e=9;
    CreateMat(g,A,n,e);
    printf("输出邻接矩阵G:\n");
    DispMat(g);
    printf("Kruskal:\n");
    Kruskal(g);
    return 0;
}
posted @ 2023-05-15 12:04  SnowDreamXUE  阅读(8)  评论(0编辑  收藏  举报  来源