USACO-Section 3.1-PROB Agri-Net

Agri-Net
Russ Cox

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.

PROGRAM NAME: agrinet

INPUT FORMAT

Line 1:The number of farms, N (3 <= N <= 100).
Line 2..end:The subsequent lines contain the N x N connectivity 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.

SAMPLE INPUT (file agrinet.in)

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

OUTPUT FORMAT

The single output contains the integer length that is the sum of the minimum length of fiber required to connect the entire set of farms.

SAMPLE OUTPUT (file agrinet.out)

28
 
裸裸的最小生成树,用来复习prim & kruskal

#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#define name "agrinet"
using namespace std;
int n,m,mst;
struct edge_
{
	int u,v,w;
}edge[10005];
int et,fa[105];
int find(int x)
{
	if (fa[x]!=x) fa[x]=find(fa[x]);
	return fa[x];
}
void Union(int a,int b)
{
	int x=find(a),y=find(b);
	if (x!=y) fa[x]=y;
}
void add(int u,int v,int w)
{
	et++;
	edge[et].u=u;edge[et].v=v;edge[et].w=w;
}
bool cmp(edge_ x,edge_ y)
{
	return x.w<y.w;
}
int main()
{
	freopen(name ".in","r",stdin);
	freopen(name ".out","w",stdout);
	cin>>n;
	int i,j,x;
	for (i=1;i<=n;i++)
	  for (j=1;j<=n;j++)
	  {
	  	  cin>>x;
	  	  if (i!=j) add(i,j,x);
	  }
	for (i=1;i<=n;i++)
	fa[i]=i;
	sort(edge+1,edge+1+et,cmp);
	for (i=1;i<=et;i++)
	{
		if (find(edge[i].u)!=find(edge[i].v))
		{
			Union(edge[i].u,edge[i].v);
			mst+=edge[i].w;
		}
	}
	cout<<mst<<endl;
	return 0;
}
/*
Executing...
   Test 1: TEST OK [0.000 secs, 4300 KB]
   Test 2: TEST OK [0.000 secs, 4300 KB]
   Test 3: TEST OK [0.000 secs, 4300 KB]
   Test 4: TEST OK [0.000 secs, 4300 KB]
   Test 5: TEST OK [0.000 secs, 4300 KB]
   Test 6: TEST OK [0.000 secs, 4300 KB]
   Test 7: TEST OK [0.000 secs, 4300 KB]
   Test 8: TEST OK [0.000 secs, 4300 KB]
   Test 9: TEST OK [0.011 secs, 4300 KB]
   Test 10: TEST OK [0.011 secs, 4300 KB]

All tests OK.
YOUR PROGRAM ('agrinet') WORKED FIRST TIME!  That's fantastic
-- and a rare thing.  Please accept these special automated
congratulations.
*/



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 内容概要 《计算机网络》文档包含了70个关于计算机网络基础知识的单项选择题,内容涉及互联网起源、网络协议、IP地址、DNS服务、电子邮件、网络拓扑结构、网络设备、网络连接方式、网络速度等多个方面。每个问题后面都提供了正确答案,适合作为学习和测试材料。 ### 适用人群 本文档适合以下人群: - 计算机科学与技术、信息技术、网络工程等专业的在校学生。 - 准备计算机网络相关考试或认证的专业人士。 - 对计算机网络基础知识感兴趣的自学者。 - 信息技术教师,作为教学资源或测试材料。 ### 使用场景及目标 1. **学习测试**:作为学生学习计算机网络理论知识后的测试工具,检验学习效果。 2. **教学辅助**:教师可以用于课堂教学,作为课后作业或课堂小测验,增强学生的理解和记忆。 3. **自学检验**:个人自学者可以通过这些题目检验自己对计算机网络基础知识的掌握程度。 4. **职业发展**:职场人士可以通过学习和测试,提升自己在计算机网络领域的专业能力。 5. **竞赛准备**:适合准备计算机网络相关竞赛的学生,作为强化训练材料。 文档的目标是通过这些精心设计的题目,帮助读者全面了解和掌握计算机网络的基本概念、原理和应用,提高解决实际问题的能力。通过学习和练习,读者将能够更加深入地理解计算机网络的工作原理,为进一步的专业学习或职业发展打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值