`
zqynux
  • 浏览: 36376 次
  • 性别: Icon_minigender_1
  • 来自: 湖南
社区版块
存档分类
最新评论

USACO 2.4 Cow Tours 牛的旅行

阅读更多
Cow Tours

Farmer John has a number of pastures on his farm. Cow paths connect some pastures with certain other pastures, forming a field. But, at the present time, you can find at least two pastures that cannot be connected by any sequence of cow paths, thus partitioning Farmer John's farm into multiple fields.

Farmer John would like add a single a cow path between one pair of pastures using the constraints below.

A field's `diameter' is defined to be the largest distance of all the shortest walks between any pair of pastures in the field. Consider the field below with five pastures, located at the points shown, and cow paths marked by lines:

                15,15   20,15
                  D       E
                  *-------*
                  |     _/|
                  |   _/  |
                  | _/    |
                  |/      |
         *--------*-------*
         A        B       C
         10,10   15,10   20,10

The `diameter' of this field is approximately 12.07106, since the longest of the set of shortest paths between pairs of pastures is the path from A to E (which includes the point set {A,B,E}). No other pair of pastures in this field is farther apart when connected by an optimal sequence of cow paths.

Suppose another field on the same plane is connected by cow paths as follows:

                         *F 30,15
                         /
                       _/ 
                     _/   
                    /     
                   *------
                   G      H
                   25,10   30,10

In the scenario of just two fields on his farm, Farmer John would add a cow path between a point in each of these two fields (namely point sets {A,B,C,D,E} and {F,G,H}) so that the joined set of pastures {A,B,C,D,E,F,G,H} has the smallest possible diameter.

Note that cow paths do not connect just because they cross each other; they only connect at listed points.

The input contains the pastures, their locations, and a symmetric "adjacency" matrix that tells whether pastures are connected by cow paths. Pastures are not considered to be connected to themselves. Here's one annotated adjacency list for the pasture {A,B,C,D,E,F,G,H} as shown above:

                A B C D E F G H
              A 0 1 0 0 0 0 0 0
              B 1 0 1 1 1 0 0 0
              C 0 1 0 0 1 0 0 0
              D 0 1 0 0 1 0 0 0
              E 0 1 1 1 0 0 0 0
              F 0 0 0 0 0 0 1 0
              G 0 0 0 0 0 1 0 1
              H 0 0 0 0 0 0 1 0

Other equivalent adjacency lists might permute the rows and columns by using some order other than alphabetical to show the point connections. The input data contains no names for the points.

The input will contain at least two pastures that are not connected by any sequence of cow paths.

Find a way to connect exactly two pastures in the input with a cow path so that the new combined field has the smallest possible diameter of any possible pair of connected pastures. Output that smallest possible diameter.

PROGRAM NAME: cowtour
INPUT FORMAT
Line 1:  An integer, N (1 <= N <= 150), the number of pastures 
Line 2-N+1:  Two integers, X and Y (0 <= X ,Y<= 100000), that denote that X,Y grid location of the pastures; all input pastures are unique. 
Line N+2-2*N+1:  lines, each containing N digits (0 or 1) that represent the adjacency matrix as described above, where the rows' and columns' indices are in order of the points just listed. 

SAMPLE INPUT (file cowtour.in)
8
10 10
15 10
20 10
15 15
20 15
30 15
25 10
30 10
01000000
10111000
01001000
01001000
01110000
00000010
00000101
00000010

OUTPUT FORMAT
The output consists of a single line with the diameter of the newly joined pastures. Print the answer to exactly six decimal places. Do not perform any special rounding on your output.

SAMPLE OUTPUT (file cowtour.out)
22.071068


描述
农民 John的农场里有很多牧区。有的路径连接一些特定的牧区。一片所有连通的牧区称为一个牧场。但是就目前而言,你能看到至少有两个牧区通过任何路径都不连通。这样,Farmer John就有多个牧场了。

John想在农场里添加一条路径(注意,恰好一条)。对这条路径有以下限制:

一个牧场的直径就是牧场中最远的两个牧区的距离(本题中所提到的所有距离指的都是最短的距离)。考虑如下的有5个牧区的牧场,牧区用“*”表示,路径用直线表示。每一个牧区都有自己的坐标:

               (15,15)   (20,15)
                 D       E
                 *-------*
                 |     _/|
                 |   _/  |
                 | _/    |
                 |/      |
        *--------*-------*
        A        B       C
        (10,10)   (15,10)   (20,10)
这个牧场的直径大约是12.07106, 最远的两个牧区是A和E,它们之间的最短路径是A-B-E。

这里是另一个牧场:

                         *F(30,15)
                        /
                      _/ 
                    _/   
                   /     
                  *------*
                  G      H
                  (25,10)   (30,10)
这两个牧场都在John的农场上。John将会在两个牧场中各选一个牧区,然后用一条路径连起来,使得连通后这个新的更大的牧场有最小的直径。

注意,如果两条路径中途相交,我们不认为它们是连通的。只有两条路径在同一个牧区相交,我们才认为它们是连通的。

输入文件包括牧区、它们各自的坐标,还有一个如下的对称邻接矩阵:

  A  B  C  D  E  F  G  H
A  0  1  0  0  0  0  0  0
B  1  0  1  1  1  0  0  0
C  0  1  0  0  1  0  0  0
D  0  1  0  0  1  0  0  0
E  0  1  1  1  0  0  0  0
F  0  0  0  0  0  0  1  0
G  0  0  0  0  0  1  0  1
H  0  0  0  0  0  0  1  0
输入文件至少包括两个不连通的牧区。

请编程找出一条连接两个不同牧场的路径,使得连上这条路径后,这个更大的新牧场有最小的直径。

格式
PROGRAM NAME: cowtour

INPUT FORMAT:

(file cowtour.in)

第1行: 一个整数N (1 <= N <= 150), 表示牧区数

第2到N+1行: 每行两个整数X,Y (0 <= X ,Y<= 100000), 表示N个牧区的坐标。注意每个 牧区的坐标都是不一样的。

第N+2行到第2*N+1行: 每行包括N个数字(0或1) 表示如上文描述的对称邻接矩阵。

OUTPUT FORMAT:

(file cowtour.out)

只有一行,包括一个实数,表示所求直径。数字保留六位小数。

SAMPLE INPUT
8
10 10
15 10
20 10
15 15
20 15
30 15
25 10
30 10
01000000
10111000
01001000
01001000
01110000
00000010
00000101
00000010
SAMPLE OUTPUT
22.071068

====================== 华丽的分割线 ======================
  实在是不会写, 直接看标程,, 但是标程也好难看懂` 思路是大致是
  point是一个结构体, point[i] 表示第i个牧区的坐标:
引用
struct point{
int x, y;
}point[MAX];

  用一个数组dis[i][j] 表示从第i个牧区到第j个牧区的最短距离(直接间接的都包括在内.), 然后还有一个数组fie[i]表示第i个牧区所在的牧场编号. diam[i]表示在fie[i]这个牧场里距离i最远的牧区之间的距离是多少.. 也就是说diam[i]表示的是同一个牧场中, 距离i最远的牧区和i之间的距离. fdiam[i] 表示编号为i的牧场的直径.
  代码:
/*
LANG: C
ID: zqy11001
PROG: cowtour
*/
#include <stdio.h>
#define INF (1e5)
#define MAX (150)
#define getint(i) scanf("%d", &i)

struct point{
	int x, y;
}point[MAX];
double dis[MAX][MAX];
double diam[MAX];
double fdiam[MAX];
int fie[MAX];
int n;

double getdis(int i, int j)
{
	struct point *a, *b;
	a = &point[i];
	b = &point[j];
	return sqrt((double)(a->x - b->x)*
			(a->x - b->x) +
			(double)(a->y - b->y)*
			(a->y - b->y));
}

void mark(int i, int m)
{
	int j;
	if(fie[i] != 0){
		return ;
	}
	fie[i] = m;
	for(j = 0; j < n; j++){
		if(dis[i][j] < INF){
			mark(j, m);
		}
	}
}

int main(void)
{
	int i, j, k;
	int c, now = 1;
	double t, max;
	freopen("cowtour.in", "r", stdin);
	freopen("cowtour.out", "w", stdout);
	getint(n);
	for(i = 0; i < n; i++){
		getint(point[i].x);
		getint(point[i].y);
	}
	
	for(i = 0; i < n; i++){
		getchar();
		for(j = 0; j < n; j++){
			c = getchar();
			if(i == j){
				dis[i][j] = 0;
			}else if(c == '0'){
				dis[i][j] = INF;
			}else{
				dis[i][j] = getdis(i, j);
			}
		}
	}
	
	for(i = 0; i < n; i++){
		if(fie[i] == 0){
			mark(i, now++);
		}
	}

	for(k = 0; k < n; k++)
	for(i = 0; i < n; i++)
	for(j = 0; j < n; j++){
		if(dis[i][j] > dis[i][k] + dis[k][j]){
			dis[i][j] = dis[i][k] + dis[k][j];
		}
	}

	for(i = 0; i < n; i++){
		for(j = 0; j < n; j++){
			if(diam[i] < dis[i][j] && dis[i][j] < INF){
				diam[i] = dis[i][j];
			}
		}
		if(fdiam[fie[i]] < diam[i]){
			fdiam[fie[i]] = diam[i];
		}
	}

	max = INF;
	for(i = 0; i < n; i++){
		for(j = 0; j < n; j++){
			if(fie[i] == fie[j]){
				continue;
			}

			t = diam[i] + diam[j] + getdis(i, j);
			if(t < fdiam[fie[i]]){
				t = fdiam[fie[i]];
			}
			if(t < fdiam[fie[j]]){
				t = fdiam[fie[j]];
			}

			if(t < max){
				max = t;
			}
		}
	}
	printf("%.6lf\n", max);
	return 0;
}
分享到:
评论

相关推荐

    usaco2.4解题报告1

    本题涉及到的编程竞赛题目是USACO 2.4章节的"ttwo",是一道关于平面内的最短路径问题。在这个问题中,我们需要解决的是在一个10x10的网格环境中,农夫John如何尽快地追捕到两只在逃的塔姆沃斯牛。这个问题可以被视为...

    usaco 合集usaco 合集usaco 合集

    《USACO 合集:全面解析与学习指南》 USACO,全称为USA Computing Olympiad,是一项针对中学生举办的在线编程竞赛,旨在提升参赛者的算法设计和问题解决能力。这个合集提供了丰富的资源,包括英文原题、中文译题、...

    USACO2001-2007历年月赛测试数据+题目+题解打包全

    资源包包括USACO 2001-2007年月赛的测试数据;usaco月赛十年题典(2000-2009),usaco月赛2002-2008题解。单独下载需资源分30分以上。为了方便编程爱好者,我这边统一下载打包。欢迎下载。

    USACO题解+代码+翻译

    USACO,全称United States Computer Olympiad,是一项面向全球中学生的计算机编程竞赛,旨在提升参赛者的算法设计、编程能力和问题解决能力。本压缩包包含了USACO比赛的题解、源代码以及对应的中文翻译,对于想要...

    USACO大牛写的前三十个的代码

    【USACO大牛写的前三十个的代码】这个资源是一个集合,包含了由USACO(美国计算机奥林匹克)竞赛中表现出色的程序员编写的前30个代码实例。这些代码是针对初学者设计的,旨在帮助那些正在探索数据结构基础知识的人。...

    01暴力枚举1

    [USACO2.4] 两只塔姆沃斯牛 The Tamworth Two是一个暴力枚举问题,给定一个 10 × 10 的图,其中有的格子是障碍物,有一个农夫在追一个牛。我们需要计算农夫多长时间可以追上牛。如果追不上,输出 0。 这个问题可以...

    usaco.rar_USACO 翻译 下载_usaco _usaco 翻译

    USACO,全称为United States阿Olympiad in Informatics,是美国计算机奥林匹克竞赛,旨在为高中生提供一个学习和展示编程技能的平台。这个比赛涵盖了算法、数据结构以及问题解决等多个方面,对于想要深入理解计算机...

    usaco 2010-2011

    ### USACO 2010-2011 季度竞赛概览与关键信息 #### 一、概述 美国计算机奥林匹克(USACO)是面向全球中学生的计算机科学竞赛,旨在发掘并培养计算机科学领域的年轻人才。USACO 2010-2011 季度竞赛于 2010 年 11 月...

    USACO题集及答案

    USACO,全称为United States Computer Olympiad,是一项面向全球中学生的计算机编程竞赛,旨在提升参赛者的算法设计、问题解决和编程能力。该比赛每年举行,分为青铜、白银、黄金和铂金四个级别,难度逐渐递增。...

    本人的USACO21JAN铜组Java代码

    USACO,全称为United States Computer Olympiad,是一项面向中学生的计算机编程竞赛,旨在提高参赛者的算法设计和问题解决能力。USACO的比赛通常分为青铜、白银、黄金和铂金四个等级,每个等级的比赛会有若干个题目...

    USACO翻译及题解

    USACO,全称United States Computer Olympiad,是一项面向全球中学生的计算机编程竞赛,旨在提升参赛者在算法设计、问题解决以及计算机科学基础方面的技能。这个压缩包文件提供了丰富的资源,帮助参赛者或学习者更好...

    usaco traning全部数据

    【标题】"usaco traning全部数据" 涉及的是一个编程竞赛训练平台——USACO(USA Computing Olympiad)的数据集。USACO是一个专门为美国中学生设计的在线编程竞赛,旨在提升参赛者的算法设计和编程能力,特别是在解决...

    usaco心得及总结

    ### USACO心得及总结 #### 第一部分 动态规划 **USACO**(美国计算机奥林匹克竞赛)作为一项国际知名的编程竞赛,不仅考验参赛者的编程能力,还对其算法理解和应用有着极高的要求。其中,动态规划(Dynamic ...

    [USACO 2021 Feb]Problem 1. Year of the Cow.zip

    Year of the Cow 是一个编程竞赛题目,源自美国计算机奥林匹克竞赛(USACO)2021年2月的比赛。USACO是一项针对高中生的在线编程竞赛,旨在提高参赛者的算法设计、问题解决和编程能力。该竞赛通常涵盖数据结构、图论...

    usaco历年测试数据

    USACO(美国计算机奥林匹克竞赛)是面向全球中学生的一项编程竞赛,主要涉及算法和问题解决能力。这个压缩包文件“usaco历年测试数据”包含了该赛事历年的测试题目和样例输入输出数据,这对于参赛者准备比赛或者提升...

    USACO答案及详解

    某些USACO题目的答案,很详细,代码清晰结构良好,算法高效易于调试

    USACO 1.1 c++源程序

    USACO,全称为United States Computer Olympiad,是一项面向中学生的国际性计算机编程竞赛,旨在提升参赛者的算法设计和编程能力。USACO比赛通常使用C++语言进行,因此"USACO 1.1 c++源程序"指的是USACO入门阶段1.1...

    USACO历年比赛测试数据:2003年

    USACO(USA Computing Olympiad)是美国计算机奥林匹克竞赛,是一项面向中学生的编程竞赛,旨在提升学生的算法设计、编程和问题解决能力。该比赛通常包括训练营和一系列在线比赛,最终选拔出优秀选手代表美国参加...

    USACO历年比赛测试数据:2004年

    USACO,全称United States Computer Olympiad,是美国计算机奥林匹克竞赛,是一项旨在培养青少年编程技能和算法理解的国际性比赛。这个比赛对于有志于在计算机科学领域深入发展的学生来说,具有很高的学习价值和挑战...

    USACO历年比赛测试数据:2005年

    USACO,全称为United States Computer Olympiad,是一项面向美国中学生的编程竞赛,旨在培养青少年在算法设计、问题解决和计算机科学方面的技能。这个压缩包包含的是2005年度USACO比赛的测试数据,对于参赛者或者对...

Global site tag (gtag.js) - Google Analytics