NOJ-1596:最少修建多长的公路能把所有村庄连起来(一)-西工大算法

本文介绍了一种实现最小生成树的Kruskal算法,使用了并查集数据结构来处理图的边集合,通过快速排序算法对边进行排序,并在排序后的边中选择不形成环的边来构建最小生成树。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <stdio.h>
#include <stdlib.h>

struct e
{
    int i;
    int j;
    int len;
};

struct e edge[100005];
int map[10000];
int n, m;

void qs (int l, int r, struct e A[]);
int find(int i, int p[]);

int main()
{
    scanf("%d%d", &n, &m);
    int i;
    for(i = 1; i <= n; i++)
    {
        map[i] = i;
    }
    for(i = 1; i <= m; i++)
    {
        scanf("%d%d%d", &edge[i].i, &(edge[i].j), &(edge[i].len));
        edge[i].i++;
        edge[i].j++;
    }
    qs(1, m, edge);
    int length = 0, flag = 0;
    int a, b;
    for(i = m; i >= 1; i--)
    {
        if(!((a = find(edge[i].i, map)) == (b = find(edge[i].j, map))))
        {
            map[b] = a;
            length += edge[i].len;
            flag++;
            if(flag == n - 1) break;
        }
    }
    printf("%d\n", length);
    return 0;
}

void qs (int l, int r, struct e A[])
{
    int i = l, j = r;
    if (l >= r)
    {
        return ;
    }
    else
    {
        A[0] = A[i];
        while (i != j)
        {
            while (i < j && A[j].len < A[0].len) j--;
            if (i < j) A[i++] = A[j];
            while (i < j && A[i].len > A[0].len) i++;
            if (i < j) A[j--] = A[i];
        }
        A[i] = A[0];
        qs (l, i - 1, A);
        qs (i + 1, r, A);
    }
}

int find(int i, int p[])
{
    int j = i;
    while(j != p[j])
    {
        j = p[j];
    }
    p[i] = j;
    return j;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值