USA 3.1 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

描述
农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场。当然,他需要你的帮助。约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共享给其他农场。为了使花费最少,他想铺设最短的光纤去连接所有的农场。你将得到一份各农场之间连接费用的列表,你必须找出能连接所有农场并所用光纤最短的方案。每两个农场间的距离不会超过100000

格式
PROGRAM NAME: agrinet

INPUT FORMAT:

(file agrinet.in)

第一行: 农场的个数,N(3<=N<=100)。

第二行..结尾: 后来的行包含了一个N*N的矩阵,表示每个农场之间的距离。理论上,他们是N行,每行由N个用空格分隔的数组成,实际上,他们限制在80个字符,因此,某些行会紧接着另一些行。当然,对角线将会是0,因为不会有线路从第i个农场到它本身。

OUTPUT FORMAT:

(file agrinet.out)

只有一个输出,其中包含连接到每个农场的光纤的最小长度。

SAMPLE INPUT
4
0 4 9 21
4 0 8 17
9 8 0 16
21 17 16 0
SAMPLE OUTPUT
28



======================= 华丽的分割线 =======================
  这一题就是最小生成树的问题, 说来复杂... 自己看数据结构吧..
/*
LANG: C
ID: zqy11001
PROG: agrinet
*/
#include <stdio.h>
#define getint(i) scanf("%d", &i)
#define MAX 100
#define INF 1e6

int map[MAX][MAX];
int visited[MAX];
int path[MAX];

int main(void)
{
	int n;
	int i, j, k;
	int min, m, tot = 0;
	freopen("agrinet.in", "r", stdin);
	freopen("agrinet.out", "w", stdout);
	getint(n);
	for(i = 0; i < n; i++){
		for(j = 0; j < n; j++){
			getint(map[i][j]);
		}
	}

	for(i = 0; i < n; i++){
		path[i] = map[0][i];
	}
	visited[0] = 1;
	for(i = 1; i < n; i++){
		min = INF;
		for(j = 0; j < n; j++){
			if(!visited[j] && min > path[j]){
				min = path[j];
				m = j;
			}
		}
		visited[m] = 1;
		tot += min;
		for(j = 0; j < n; j++){
			if(visited[j] == 0 && map[m][j] < path[j]){
				path[j] = map[m][j];
			}
		}
	}
	printf("%d\n", tot);
	return 0;
}

你可能感兴趣的:(数据结构,.net,互联网,J#)