数据结构prim算法和kruskal算法

Prim算法

void Prim(MGraph g, int v)
{
    int lowcost[MAXV];
    int MIN;
    int closest[MAXV], i, j, k;
    for (i = 0; i < g.n; i++)      //给lowcost[]和closest[]置初值
    {
        lowcost[i] = g.edges[v][i];
        closest[i] = v;
    }
    for (i = 1; i < g.n; i++)      //找出(n-1)个顶点
    {
        MIN = INF;
        for (j = 0; j < g.n; j++)     //在(V-U)中找出离U最近的顶点k
            if (lowcost[j] != 0 && lowcost[j] < MIN)
            {
                MIN = lowcost[j];
                k = j;          //k记录最近顶点的变化
            }
        printf("%2d---%2d : %d\n", closest[k], k, MIN);          
        lowcost[k] = 0;
        for (j = 0; j < g.n; j++)      //标记k已经加入U
        {
            if (lowcost[j] != 0 && g.edges[k][j] < lowcost[j])       // 对(V-U)中的顶点j进行调整
            {
                lowcost[j] = g.edges[k][j];
                closest[j] = k;            
            }          //修改数组
        }
    }
}

Kruskal算法

void Kruskal(MGraph g)
{
    typedef struct
    {
        int u, v, w;
    } Edge; //边的起始顶点,终止顶点与权值
    Edge e[MAXV];
    int i, j, m = 0; //m是边的数量

    for (i = 0; i < g.n; i++)
        for (j = i + 1; j < g.n; j++)
            if (g.edges[i][j] != INF) //在邻接矩阵中检索边并根据权值用插入排序法排升序
            {
                int l;
                for (l = 0; l < m && g.edges[i][j] >= e[l].w; l++)
                    ;
                for (int k = m; k > l; k--)
                    e[k] = e[k - 1];
                e[l].u = i, e[l].v = j, e[l].w = g.edges[i][j];
                m++; //新增边插入,边数加1
            }

    int s[MAXV]; //简化版并查集,s[i]存放i的代表(或称双亲结点)
    for (i = 0; i < g.n; i++)
        s[i] = i;                     //并查集初始化
    for (j = -1, i = 1; i < g.n; i++) //循环n-1次,找出n-1条边
    {
        int v1, v2;
        do
        {
            j++;
            v1 = e[j].u, v2 = e[j].v;
            while (v1 != s[v1])
                v1 = s[v1]; //分别求两端点的代表(点)
            while (v2 != s[v2])
                v2 = s[v2];
        } while (v1 == v2); //两端点代表相同,构成回路,继续找
        printf("%2d---%2d : %d\n", e[j].u, e[j].v, e[j].w);
        s[e[j].v] = v1; //设置其中一个端点与另一端点的代表相同,及合并
        //也可以是s[e[j].u]=v2;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值