题目大意: 一个地方要修路, 一共有n个村庄, 编号为1到n,一开始没有路, 现在需要修路,使得每个村庄都是连通的。 给出两个村庄要修路的话就需要修的距离, 使所有修的路中最大的路尽量小, 求出这个最小的值(所有要修的路里最长的)。
题目分析: 题目要求是把n个顶点连成一个连通的无向图。 求无向图中最大边权值的最小值。每两个点之间都有边, 是稠密图, 用Prim算法。
代码:
using namespace std; const int INF = 1 << 31 -1; int cost[505][505]; int mincost[505]; int n; bool used[505]; int Prim() { int ans = -1; for(int i=0; i<n; ++i) { mincost[i] = INF; used[i] = false; } mincost[0] = 0; while(1) { int v = -1; for(int i=0; i<n; ++i) if(!used[i] && (v == -1 || mincost[i] < mincost[v])) v = i; if(v == -1) break; used[v] = true; ans = max(ans, mincost[v]); for(int i=0; i<n; ++i) mincost[i] = min(mincost[i], cost[v][i]); } return ans; } int main() { int T; scanf("%d", &T); while(T--) { scanf("%d", &n); for(int i=0; i<n; ++i) for(int j=0; j<n; ++j) scanf("%d", &cost[i][j]); printf("%d\n", Prim()); } return 0; }