1. 程式人生 > >NOJ-1596:最少修建多長的公路能把所有村莊連起來(一)-西工大演算法

NOJ-1596:最少修建多長的公路能把所有村莊連起來(一)-西工大演算法

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