第1关:Agri-Net(中文版)
题目描述
农夫约翰被选为镇长了!他的竞选承诺之一是将互联网连接到该地区的所有农场。他当然需要你的帮助。 农民约翰为他的农场订购了高速连接,并打算与其他农民共享他的连接。为了将成本降到最低,他希望铺设最少数量的光纤来连接他的农场和所有其他农场。 给定连接每一对农场所需的光纤数量的列表,您必须找到连接它们所需的最小光纤数量。每个农场必须连接到其他农场,这样数据包就可以从任何一个农场流到任何其他农场。 任何两个农场之间的距离都不会超过 100000。
输入格式
输入包括几种情况。对于每种情况,第一行包含农场的数量 N (3 <= N <= 100)。下面几行包含了 N × N 的连通性矩阵,其中每个元素表示从一个农场到另一个农场的距离。逻辑上,它们是由 N 个空格分隔的整数组成的N行。从物理上讲,它们的长度被限制在 80 个字符,所以一些行可以接续到其他行。当然,对角线将是 0,因为从农场 i 到它自己的距离对这个问题来说并不有趣。
输出格式
对于每种情况,输出一个整数长度,该长度是连接整个农场集所需的最小光纤长度的和。
输入输出样例
输入
4
0 4 9 21
4 0 8 17
9 8 0 16
21 17 16 0
输出
28
最后通关代码:
#include<stdio.h>
int m,n,sum,e[110][110],book[110],dis[110];
int inf = 99999999;
void Prim()
{
int i,j,k,min;
for(i = 1; i <= n; i ++)
{
dis[i] = e[1][i];
book[i] = 0;
}
dis[1] = 0;
book[1] = 1;
for(i = 1; i < n; i ++)
{
min = inf;
for(j = 1; j <= n; j ++)
if(book[j] == 0 && dis[j] < min)
{
min = dis[j];
k = j;
}
sum += min;
book[k] = 1;
for(j = 1; j <= n; j ++)
if(book[j] == 0 && dis[j] > e[k][j])
dis[j] = e[k][j];
}
}
int main()
{
int i,j;
while(scanf("%d",&n) != EOF)
{
sum = 0;
for(i = 1; i <= n; i ++)
for(j = 1; j <= n; j ++)
scanf("%d",&e[i][j]);
Prim();
printf("%d\n",sum);
}
return 0;
}