Agri-Net
题目大意:先输入一个数n,
Sample Input
4 0 4 9 21 4 0 8 17 9 8 0 16 21 17 16 0
Sample Output
28
看到网上都是用prim写得,用Kruskal写得比较少,所以就决定用Kruskal写了
#include <cstdio>
#include <algorithm>
using namespace std;
int n;
int pre[101];
struct ak{
int x, y, dis;
}rela[10000];
void init() {
for(int i = 0; i < n; i++)
pre[i] = i;
}
int cmp(ak c, ak e) {
return c.dis < e.dis;
}
int find(int x) {
int r = x;
while(r != pre[r])
r = pre[r];
int i = x, j;
while(i != r) {
j =pre[i];
pre[i] = r;
i = j;
}
return r;
}
bool join(int x, int y) {
int fx = find(x);
int fy = find(y);
if(fx != fy) {
pre[fx] = fy;
return true;
}
return false;
}
int Scanf_a() {
int a, q = 0, total = 0;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++) {
scanf("%d", &a);
if(i != j) {
rela[q].x = i;
rela[q].y = j;
rela[q++].dis = a;
}
}
init();
sort(rela, rela + q, cmp);
for(int i = 0; i < q; i++) {
if(join(rela[i].x, rela[i].y))
total += rela[i].dis;
}
return total;
}
void Printf_a(int total) {
printf("%d\n", total);
}
int main() {
while(scanf("%d", &n) !=EOF) {
Printf_a(Scanf_a());
}
return 0;
}