题目翻译:
- Description:
有N个村庄,编号从1到N,您应该修建一些道路,以便每两个村庄可以相互连接。 我们说两个村庄A和B是连通的,当且仅当A和B之间有一条道路,或者存在一个村庄C使得A和C之间有一条道路,并且C和B连通时。
我们知道,一些村庄之间已经存在一些道路,您的工作是建造一些道路,以使所有村庄都连接起来,并且所有道路的长度都应最小。 - Iuput:
第一行是整数N(3 <= N <= 100),它是村庄的数量。 然后是N行,其中第i个包含N个整数,而这N个整数中的第j个是村庄i与村庄j之间的距离(该距离应为[1,1000]之内的整数)。
然后有一个整数Q(0 <= Q <= N *(N +1)/ 2)。 然后出现Q条线,每条线包含两个整数a和b(1 <= a <b <= N),这意味着已经建立了村庄a和村庄b之间的道路。 - Output:
您应该输出一条包含整数的线,该整数是要连接所有村庄的所有道路的长度,并且该值是最小值。
题目分析:
这个题其实就是最小生成树的题目,让你把N个点联通所需要的最小代价对吧,只不过特别的是已经给你联通好了一部分,那就将距离设成0即可。附上代码:
#include<iostream>
using namespace std;
int map[101][101] = {
0 };
int flag[101] = {
0 };
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < n; j++)
cin >> map[i + 1][j + 1];
}
int m;
cin >> m;
for (int i = 0; i < m; i++)
{
int a, b;
cin >> a >> b;
map[a][b] = 0;
map[b][a] = 0;
}
int cnt = 1; int ans = 0;
while (cnt == 1)
{
int min = 1e8; int sub = 101; cnt = 0;
for (int i = 2; i <= n; i++)
{
if (flag[i]==0&&map[1][i] < min)
{
min = map[1][i];
sub = i;
cnt = 1;
}
}
ans += min;
map[1][sub] = 0;
flag[sub] = 1;
for (int i = 2; i <= n; i++)
{
if (map[sub][i] < map[1][i])
{
map[1][i] = map[sub][i];
}
}
}
cout << ans-1e8;
return 0;
}