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 = 1; i <= n; i++){ lowcost[i] = g[1][i]; used[i] = 0; } used[1] = 1; ans = 0; for(int i = 1; i <= n; i++){ int j=1; while(used[j]) j++; for(int k = 1; k <= n; k++) if(!used[k] && lowcost[k] < lowcost[j]) j = k; ans = max(ans, lowcost[j]); used[j] = 1; for(int k = 1; 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 = 1; i <= n; i++) for(int j = 1; j <= n; j++) scanf("%d", &g[i][j]); prim(); printf("%d\n", ans); } return 0; }