Prim算法:任选一个点,加入集合,找出和它最近的点,加入集合,然后用加入集合的点去更新其它点的最近距离......这题求最小生成树最大的边,于是每次更新一下最大边。
#include <cstdio>
#define max(x, y) ((x) > (y) ? (x) : (y))
#define N 505
int t, n, g[N][N], lowcost[N], used[N], ans;
void prim(){
for(int i = ; i <= n; i++){
lowcost[i] = g[][i];
used[i] = ;
}
used[] = ;
ans = ;
for(int i = ; i <= n; i++){
int j=;
while(used[j]) j++;
for(int k = ; k <= n; k++)
if(!used[k] && lowcost[k] < lowcost[j])
j = k;
ans = max(ans, lowcost[j]);
used[j] = ;
for(int k = ; k <= n; k++)
if(!used[k] && g[j][k] < lowcost[k])
lowcost[k] = g[j][k];
}
}
int main(){
scanf("%d", &t);
while(t--){
scanf("%d", &n);
for(int i = ; i <= n; i++)
for(int j = ; j <= n; j++)
scanf("%d", &g[i][j]);
prim();
printf("%d\n", ans);
}
return ;
}