NOJ-1596:最少修建多長的公路能把所有村莊連起來(一)-西工大演算法
阿新 • • 發佈:2018-12-12
#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; }