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