Agri-Net
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 44487   Accepted: 18173

Description

Farmer John has been elected mayor of his town! One of his campaign promises was to bring internet connectivity to all farms in the area. He needs your help, of course. 

Farmer John ordered a high speed connection for his farm and is going to share his connectivity with the other farmers. To minimize cost, he wants to lay the minimum amount of optical fiber to connect his farm to all the other farms. 

Given a list of how much fiber it takes to connect each pair of farms, you must find the minimum amount of fiber needed to connect them all together. Each farm must connect to some other farm such that a packet can flow from any one farm to any other farm. 

The distance between any two farms will not exceed 100,000. 

Input

The input includes several cases. For each case, the first line contains the number of farms, N (3 <= N <= 100). The following lines contain the N x N conectivity matrix, where each element shows the distance from on farm to another. Logically, they are N lines
of N space-separated integers. Physically, they are limited in length to 80 characters, so some lines continue onto others. Of course, the diagonal will be 0, since the distance from farm i to itself is not interesting for this problem.

Output

For each case, output a single integer length that is the sum of the minimum length of fiber required to connect the entire set of farms.

Sample Input

4
0 4 9 21
4 0 8 17
9 8 0 16
21 17 16 0

Sample Output

28

题意:
有n个农场。已知这n个农场都互相相通。有一定的距离,如今每一个农场须要装光纤,问怎么安装光纤能将全部农场都连通起来,而且要使光纤距离最小,输出安装光纤的总距离。


思路:
最小生成树,给出的二维矩阵代表他们的距离,prim算法求解就可以。
代码:
/*
prim
Memory 204K
Time 16MS
*/
#include <iostream>
#include<cstdio>
using namespace std;
#define MAXV 101
#define inf 1<<29 int map[MAXV][MAXV],n; void prim()
{
int i,j,dis[MAXV],vis[MAXV],mi,v;
for(i=1;i<=n;i++)
{
dis[i]=map[1][i];
vis[i]=0;
}
for(i=1;i<=n;i++)
{
mi=inf;
for(j=1;j<=n;j++)
if(!vis[j] && dis[j]<mi)
{
mi=dis[j];
v=j;
} vis[v]=1;
for(j=1;j<=n;j++)
if(!vis[j] && dis[j]>map[v][j])
dis[j]=map[v][j];
}
int sum=0;
for(i=1;i<=n;i++)
sum+=dis[i]; printf("%d\n",sum);
} int main()
{
int i,j;
while(~scanf("%d",&n))
{
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
scanf("%d",&map[i][j]);
prim();
}
return 0;
}







最新文章

  1. js base64加密,后台解密
  2. debian的版本演进
  3. C#如何反射出委托的签名,如何使用反射调用委托
  4. C#函数式程序设计之用闭包封装数据
  5. 自己实现的一款在线Javascript正则表达式测试器——JRE-Parser
  6. ArcGIS Engine -- 常用方法
  7. Umbraco(3) - CSS &amp; Javascript(翻译文档)
  8. 删除utorrent广告栏
  9. 使用repeater控件显示列表替代treeview
  10. 管理员把我的admin权限去掉了,那么如何获得jdk zip安装呢?这篇可以帮你。
  11. 写了个小爬虫,为何用上代理ip总是出现错误。
  12. 英文:known good board ( KGB) / 中文:测试用标准板,黄金板
  13. JSON 序列化的时候忽略无效的属性值
  14. Python os.access() 方法
  15. RabbitMQ五种消息队列学习(三)–Work模式
  16. mysql 设置用户并授权
  17. 初探性能优化——2个月到4小时的性能提升(copy)推荐阅读
  18. 阿里云url解析,发布web后去除url中的端口号
  19. nodejs+gulpjs压缩js代码
  20. 在IOS 模拟器中 输入中文

热门文章

  1. c:if标签--判断不为空和其他的值判断
  2. 出现了错误。详细消息: 3 uncommitted changes would be overwritten by merge
  3. 使用Auto Layout中的VFL(Visual format language)——代码实现自动布局
  4. (7) openssl dgst(生成和验证数字签名)
  5. go语言碎片整理之标准库log
  6. Images for Journals
  7. Saving James Bond - Hard Version
  8. 数据结构实验7:实现二分查找、二叉排序(查找)树和AVL树
  9. JavaScript验证密码强度
  10. Go 方法和接收者