一开始边开少了,结果RE了一次。改了一下边的大小就过了
Kruskal算法就是找边,先把边都存起来,然后排序,挨个查找并且利用并查集判断
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
#define LLEN 102
#define EDGELEN 10010
int map[LLEN][LLEN];
typedef struct edge{
int u, v, w;
}edge;
edge e[EDGELEN];
int p[LLEN];
bool cmp(edge a, edge b) {
return a.w < b.w;
}
void init(int n) {
for(int i = 0; i <= n; i++) {
p[i] = i;
}
}
int find(int x) {
return p[x] == x ? x : (p[x] = find(p[x]));
}
int kruskal(int n, int q, int index) {
int ans = 0;
for(int i = 0; i < index; i++) {
int t1 = find(e[i].u);
int t2 = find(e[i].v);
if(t1 != t2) {
p[t1] = t2;
ans += e[i].w;
}
}
return ans;
}
int main() {
int n, q;
while(scanf("%d", &n) != EOF) {
int index = 0;
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
scanf("%d", &map[i][j]);
}
}
for(int i = 1; i <= n; i++) {
for(int j = 1; j < i; j++) {
e[index].u = i;
e[index].v = j;
e[index++].w = map[i][j];
}
}
sort(e, e+index, cmp);
init(n);
scanf("%d", &q);
for(int i = 0; i < q; i++) {
int a, b;
scanf("%d%d", &a, &b);
int t1 = find(a);
int t2 = find(b);
if(t1 != t2) {
p[t1] = t2;
}
}
int ans = kruskal(n, q, index);
printf("%d\n", ans);
}
return 0;
}