这题就是最小生成树Prim,d[]代表的是整个连接集合和未连接点的最小距离。
#include <cstdio>
int map[105][105];
int vis[105], d[105];
const int INF = 0x3f3f3f3f;
int n,ans;
void Prim()
{
d[0] = 0;
ans = 0;
for (int i = 0; i < n;i++) {
int end = -1;
for (int j = 0; j < n;j++) {
if (!vis[j]&&(end==-1||d[j]<d[end])) {
end = j;
}
}
vis[end] = 1;
ans += d[end];
for (int j = 0; j < n;j++) {
if (!vis[j]&&d[j]>map[end][j])
d[j] = map[end][j];
}
}
}
int main()
{
while (scanf("%d",&n)!=EOF) {
for (int i = 0; i < 105;i++) {
vis[i] = 0;
d[i] = INF;
}
for (int i = 0; i < n;i++) {
for (int j = 0; j < n;j++) {
scanf("%d",&map[i][j]);
}
}
Prim();
printf("%d
", ans);
}
return 0;
}