procedure2012
It's not worth it to know you're not worth it!

【题目】:Cow Tours

【来源】:USACO

【关键字】:图论 最短路径 floyd

【题目大意】:将两个图用一条路径连接,使距离最远的两点的最短路径最小,求这个最短路径。

//================================================================================================

【分析】:一开始理解错题意了,还以为是位置最远的两个点...........先用floyd求出每两个点的最短路径,用r[i]记录所有i可到的点中最远点的距离。然后一一将两个不在一个图里的两点a,b相连,新的更大的图的直径就是r[a]+r[b]+d[a,b](两点距离),然后从中找出最大即可。但还有一种情况:新图的直径最小值小于原来两图中的直径最大值,此时需输出原来两图的最大直径才符合要求。

【小结】:一开始几乎就已经想到了,看错了题给毙了。还有最后那种情况,想半天才搞定。

//================================================================================================

【代码】:

View Code
 1 type
2 rec=record
3 x,y:longint;
4 end;
5 var
6 n,i,j,k:longint;
7 max,maxn:real;
8 ch:char;
9 r:array[0..200] of real;
10 a:array[0..200] of rec;
11 f,w:array[0..200] of longint;
12 p:array[0..200,0..200] of real;
13 begin
14 assign(input,'cowtour.in');reset(input);
15 assign(output,'cowtour.out');rewrite(output);
16 readln(n);
17 for i:=1 to n do
18 readln(a[i].x,a[i].y);
19 for i:=1 to n do
20 begin
21 for j:=1 to n do
22 begin
23 read(ch);
24 if ch='1' then
25 p[i,j]:=sqrt(sqr(abs(a[i].x-a[j].x))+sqr(abs(a[i].y-a[j].y)));
26 if ch='0' then p[i,j]:=999999;
27 end;
28 readln;
29 end;
30 for k:=1 to n do
31 for i:=1 to n do
32 for j:=1 to n do
33 if (p[i,k]<999999)and(p[k,j]<999999) then
34 if p[i,j]>p[i,k]+p[k,j] then p[i,j]:=p[i,k]+p[k,j];
35
36 maxn:=0;
37 for i:=1 to n do
38 for j:=1 to n do
39 if (p[i,j]<999999)and(r[i]<p[i,j])and(i<>j) then
40 begin
41 r[i]:=p[i,j];
42 if maxn<r[i] then maxn:=r[i];
43 end;
44 max:=999999;
45 for i:=1 to n do
46 for j:=1 to n do
47 if (p[i,j]=999999)and(i<>j)and(max>r[i]+r[j]+sqrt(sqr(a[i].y-a[j].y)+sqr(a[i].x-a[j].x))) then
48 max:=r[i]+r[j]+sqrt(sqr(a[i].y-a[j].y)+sqr(a[i].x-a[j].x));
49 if max>maxn then writeln(max:0:6) else writeln(maxn:0:6);
50 close(input);
51 close(output);
52 end.



posted on 2011-10-20 01:48  procedure2012  阅读(254)  评论(0)    收藏  举报