目录
题目描述
农夫约翰的农场里有很多牧区。牛道使一些牧区与其它一些牧区相连,组成一个牧场。但是目前,你能看到至少有两个牧区不能通过任何路径连通,这使农夫约翰的农场分成了多个牧场。
农夫约翰想在牧场里添加一条牛道,对这条牛道有以下限制:
一个牧场的“直径”就是牧场中离得最远的两个牧区的最短距离。考虑如下的有5个牧区的牧场,牧区用“*”表示,牛道用直线表示。
这个牧场的“直径”大约是12.07106, 因为所有的两对牧场之间最短路径集中最长的一条是从A到E的路径(路径是A到B到E)。
假设同一平面上另外一块牧场,如下所示:
在这个只有两个牧场的农场上,农夫约翰会在这两个牧场(即点集{A,B,C,D,E}和{F,G,H})之间添加一条牛道,这样连接在一起的牧场{A,B,C,D,E,F,G,H}的直径最小。
注意,牛道不会仅仅因为它们彼此交叉而连接在一起;它们只在同一个牧区连通。
输入文件包括牧区、牧区的坐标和一个对称“邻接”矩阵,该矩阵表示两个牧区是否由牛道连接。牧区不被认为是与自己相连的。下面是一个带注释的农场{A,B,C,D,E,F,G,H}的邻接矩阵:
其他邻接表中可以直接使用行列而不使用字母来表示牧区的连接。输入数据中不包括牧区的名称。
输入文件至少包括两个互不相通的牧场。
请编程找出一种方法,将输入中的两个牧场用一条牛道连接起来,使这个更大的新牧场有最小的直径。输出在所有牧场中最小的可能的直径。
程序名
cowtour
输入格式
行数 | 内容 |
---|---|
第一行: | 一个整数,N (1 <= N <= 150),牧区的数量 |
第2到N+1行: | 两个整数,X和Y (0 <= X,Y <= 100000),表示牧场的位置;所有牧场的位置没有重复。 |
第N+2到2*N+1行: | 每行包含N个数字(0或1),表示如上所述的邻接矩阵,其中行和列是按照刚才列出的牧区的顺序排列的。 |