回 帖 发 新 帖 刷新版面

主题:最小生成树的prim算法和kruscal算法

#include <stdio.h>
#define  MAX_VERTEX_NUM  10
#define  INFINITY        1000

typedef struct Edge
{
    int weight;
}Edge, EdgeMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

typedef struct MGraph
{
    EdgeMatrix   edges;
    int vexnum;
    int edgenum;
}MGraph;

typedef struct VexGroup
{
    int vertex;
    int group;
}VexGroup;

typedef struct EdgeMuster
{
    int  tail;
    int  head;
    int  weight;
    bool used;
}EdgeMuster;

void InitializeMG(MGraph &G)
{
    G.edgenum = G.vexnum = 0;
    for(int i = 0; i < MAX_VERTEX_NUM; ++i)
        for(int j = 0; j < MAX_VERTEX_NUM; ++j)
            G.edges[i][j].weight = INFINITY;
}

void CreateGraph(MGraph &G)
{
    int i, j;
    G.vexnum = 6;
    G.edgenum = 10;

    G.edges[0][1].weight = G.edges[1][0].weight = 6;
    G.edges[0][2].weight = G.edges[2][0].weight = 1;
    G.edges[0][3].weight = G.edges[3][0].weight = 5;
    G.edges[1][2].weight = G.edges[2][1].weight = 5;
    G.edges[1][4].weight = G.edges[4][1].weight = 3;
    G.edges[2][3].weight = G.edges[3][2].weight = 5;
    G.edges[2][4].weight = G.edges[4][2].weight = 6;
    G.edges[2][5].weight = G.edges[5][2].weight = 4;
    G.edges[3][5].weight = G.edges[5][3].weight = 2;
    G.edges[4][5].weight = G.edges[5][4].weight = 6;

    printf("\tv1\tv2\tv3\tv4\tv5\tv6\n");
    for(i = 0; i < G.vexnum; ++i)
    {
        printf("\n\nv%d\t", i+1);
        for(j = 0; j < G.vexnum; ++j)
            printf("%d\t", G.edges[i][j].weight);
    }
}

void InitializeEVG(MGraph G, EdgeMuster E[], VexGroup VG[])
{
    int i, j, k = 0;
    for(i = 0; i < G.vexnum; ++i)
    {
        VG[i].vertex = VG[i].group = i;
        for(j = 0; j < i; ++j)
            if(G.edges[i][j].weight != INFINITY)
            {
                E[k].head   = j;
                E[k].tail   = i;
                E[k].weight = G.edges[i][j].weight;
                E[k++].used   = false;
            }
    }
}

int GetMinIndex(MGraph G, EdgeMuster E[], VexGroup VG[])
{
    int i, min_index = -1, min = INFINITY;
    for(i = 0; i < G.edgenum; ++i)
    {
        if(!E[i].used 
            && VG[E[i].head].group != VG[E[i].tail].group
            && E[i].weight < min)
        {
            min_index = i;
            min = E[i].weight;
        }
    }
    return min_index;
}

void MiniSpanTree_Kruskal(MGraph G)
{
    int i, j, k;
    EdgeMuster *E = new EdgeMuster[G.edgenum];
    VexGroup  *VG = new VexGroup[G.vexnum];
    InitializeEVG(G, E, VG);

    printf("\n\nThe Minimal-Span-Tree is composed of following edges:\nedge\t\tWeight\n");
    for(i = 1; i < G.vexnum; ++i)
    {
        k = GetMinIndex(G, E, VG);
        E[k].used = true;
        for(j = 0; j < G.vexnum; ++j)
        {
            if(VG[j].group == VG[E[k].head].group)
                VG[j].group = VG[E[k].tail].group;
        }
        printf("<%d, %d>\t\t%d\n", E[k].tail, E[k].head, E[k].weight);
    }
}

void main()
{
    MGraph  G;
    InitializeMG(G);
    CreateGraph(G);
    MiniSpanTree_Kruskal(G);
}

回复列表 (共5个回复)

沙发

#include <stdio.h>
#define  MAX_VERTEX_NUM  10
#define  INFINITY        1000

typedef struct Edge
{
    int weight;
}Edge, EdgeMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

typedef struct MGraph
{
    EdgeMatrix   edges;
    int vexnum;
    int edgenum;
}MGraph;

typedef struct
{
    int vertex;
    int lowcost;
}Closedge;

void InitializeMG(MGraph &G)
{
    G.edgenum = G.vexnum = 0;
    for(int i = 0; i < MAX_VERTEX_NUM; ++i)
        for(int j = 0; j < MAX_VERTEX_NUM; ++j)
            G.edges[i][j].weight = INFINITY;
}

void CreateGraph(MGraph &G)
{
    int i, j;
    G.vexnum = 6;
    G.edgenum = 10;

    G.edges[0][1].weight = G.edges[1][0].weight = 6;
    G.edges[0][2].weight = G.edges[2][0].weight = 1;
    G.edges[0][3].weight = G.edges[3][0].weight = 5;
    G.edges[1][2].weight = G.edges[2][1].weight = 5;
    G.edges[1][4].weight = G.edges[4][1].weight = 3;
    G.edges[2][3].weight = G.edges[3][2].weight = 5;
    G.edges[2][4].weight = G.edges[4][2].weight = 6;
    G.edges[2][5].weight = G.edges[5][2].weight = 4;
    G.edges[3][5].weight = G.edges[5][3].weight = 2;
    G.edges[4][5].weight = G.edges[5][4].weight = 6;

    printf("\tv1\tv2\tv3\tv4\tv5\tv6\n");
    for(i = 0; i < G.vexnum; ++i)
    {
        printf("\n\nv%d\t", i+1);
        for(j = 0; j < G.vexnum; ++j)
            printf("%d\t", G.edges[i][j].weight);
    }
}

int GetMinIndex(MGraph G, Closedge closedge[])
{
    int i, min_index = -1, min = INFINITY;
    for(i = 1; i < G.vexnum; ++i)
        if(closedge[i].lowcost && closedge[i].lowcost < min)
        {
            min = closedge[i].lowcost;
            min_index = i;
        }

    return min_index;
}

bool MiniSpanTree_Prim(MGraph G, Closedge closedge[], int v0)
{
    int i, j, k;
    for(i = 0; i < G.vexnum; ++i)
    {
        closedge[i].vertex  = v0;
        closedge[i].lowcost = G.edges[v0][i].weight;
    }
    closedge[v0].lowcost = 0;

    printf("\n\nThe Minimal-Span-Tree is composed of following edges:\nedge\t\tWeight\n");
    for(i = 1; i < G.vexnum; ++i)
    {
        k = GetMinIndex(G, closedge);
        if(k == -1)
            return false;
        printf("<%d, %d>\t\t%d\n", 
            closedge[k].vertex, k, closedge[k].lowcost);
        closedge[k].lowcost = 0;
        for(j = 0; j < G.vexnum; ++j)
            if(G.edges[k][j].weight  < closedge[j].lowcost)
            {
                closedge[j].vertex  = k;
                closedge[j].lowcost = G.edges[k][j].weight;
            }
    }
    return true;
}

void main()
{
    MGraph  G;
    Closedge closedge[6];
    InitializeMG(G);
    CreateGraph(G);
    if(!MiniSpanTree_Prim(G, closedge, 0))
        printf("\nCan not create a Minimal-Span-Tree\n");
}

板凳

顶一下,要用到这个资料.

3 楼


到这个网站看有人的算法没有
算法源码吧  [url=http://www.sfcode.cn/]http://www.sfcode.cn/[/url]

4 楼

为怎么我两个都运行不了..

5 楼

TC不行

我来回复

您尚未登录,请登录后再回复。点此登录或注册