RT,算了一下总空间也就不过大概295KB,一道125MB的题居然MLE了……orz
觉得问题应该是出在find函数上,因为把整篇代码里唯一有find的一行注释掉就不MLE了(结果)
#include <bits/stdc++.h>
using namespace std;
struct edge {
int fr, to;
int v;
}e[25005];
int n;
bool cmp (edge a, edge b) {
return a.v < b.v;
}
int fa[505];
int find (int p) {
if (p == fa[p]) {
return p;
}
fa[p] = find(fa[p]);
return fa[p];
}
int ind = 0, A;
long long int kruskal () {
sort(e + 1, e + ind + 1, cmp);
long long int ans = 0, time = n - 1;
for (int t = 1; t <= ind; t++) {
int p = find(e[t].fr), q = find(e[t].to);
if (p == q) {
continue;
}
fa[p] = q;
ans += min(e[t].v, A);
time--;
if (time == 0) {
break;
}
}
return ans;
}
int main () {
scanf("%d %d", &A, &n);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
int z;
scanf("%d", &z);
if (i == j || z == 0)
continue;
e[++ind].fr = i;
e[ind].to = j;
e[ind].v = z;
}
}
for (int i = 1; i <= n; i++) {
fa[i] = i;
}
printf("%lld\n", kruskal() + A);
return 0;
}