共42道题,当前是第11

初赛真题

现在政府计划在某个区城的城市之间建⽴⾼速公路,以使得其中任意两个城市之间都有直接或间接的⾼速公路相连。费⽤为每千⽶为⼀个单位价格,求最⼩费⽤。 

输⼊: $n$ ($n \leq 100$,表示城市数⽬)。 接下来 $n$ ⾏,每⾏两个数 $x_i, y_i$,表示第个城市的坐标,(单位:千⽶)。) 

输出: 最⼩费⽤(保留 $2$ 位⼩数)。 程序如下:

#include<iostream>
#include<cstdio>
using namespace std;
const int maxn = 101;
struct tcity {
	float x, y;
};
tcity c[maxn];
float d[maxn][maxn], a, minf;
int p[maxn], n, i, j, k;

int main() {
	cin >> n;
	for (i = 1; i <= n; i++)
		cin >> c[i].x >> c[i].y;
	for (i = 1; i <= n; i++)
		for (j = i; j <= n; j++)
			d[i][j] = ___(1)___;
	p[1] = 0;
	for (i = 2; i <= n; i++) ___(2)___;
	for (i = 1; i <= n - 1; i++) {
		minf = 1E10;
		for (j = 1; j <= n; j++) {
			if (___(3)___) {
				minf = d[p[j]][j];
				(___(4)___)
			}
		}
		a = a + d[p[k]][k];
		p[k] = 0;
		for (j = 1; j <= n; j++)
			if (___(5)___) p[j] = k;
	}
	printf("%0.2f", a);
	return 0;
}

1. D。
2. A。
3. B。
4. D。
5. A。

这道题目是在进行最小生成树的求解,使用了 `Prim` 算法。首先计算出任意两点之间的距离储存在 $d[i][j]$ 中,然后通过维护数组 $p$($p[i]$ 表示节点 和已生成集合中哪个点是最近的)来完成 `Prim` 过程。所以在每有一个新节点加入到已生成集合中时要枚举所有其他的点来更新其 $p[i]$ 。

Question

1. (1) 处应填( )

2. (2) 处应填( )

3. (3) 处应填( )

4. (4) 处应填( )

5. (5) 处应填( )

陈伦制作 版权所无 粤ICP备16127491号-1