📄 usaco 2_4_3 cow tours 题解_leokan的blog.mht
字号:
for j:=3D1 to i=20
=
do<BR> &=
nbsp; =20
=
begin<BR> &nbs=
p; =20
=
read(ch);<BR> =
=20
if ch=3D'1'=20
=
then<BR>  =
; =
=20
=
begin<BR> &nbs=
p;  =
; =20
=
map[i,j]:=3Dsqrt(sqr(xy[i,1]-xy[j,1])+sqr(xy[i,2]-xy[j,2]));<BR> &nb=
sp; &nbs=
p;  =
; =20
=
map[j,i]:=3Dmap[i,j];<BR> =
&=
nbsp; =20
=
end<BR> =
=
else=20
=
begin<BR> &nbs=
p;  =
; =20
=
map[i,j]:=3Dmaxlen;<BR> &n=
bsp; &nb=
sp; =20
=
map[j,i]:=3Dmaxlen;<BR> &n=
bsp; &nb=
sp; =20
=
end;<BR>  =
; =20
=
end;<BR>  =
;=20
readln;<BR> =20
end;<BR> close(input);<BR>end;<BR>procedure=20
floyd;<BR>var<BR> =20
i,j,k:integer;<BR>begin<BR> for k:=3D1 to n=20
do<BR> for i:=3D1 to n-1 =
=
do<BR> =
for j:=3Di+1 to n=20
=
do<BR> &=
nbsp; =20
if map[i,k]+map[k,j]<map[i,j]=20
=
then<BR>  =
; =20
=
begin<BR> &nbs=
p;  =
;=20
=
map[i,j]:=3Dmap[i,k]+map[k,j];<BR> &nb=
sp; &nbs=
p; =20
=
map[j,i]:=3Dmap[i,j];<BR> =
=20
end;<BR>end;<BR>procedure =
maxdistance;<BR>var<BR> =20
i,j:integer;<BR>begin<BR> =20
fillchar(maxdis,sizeof(maxdis),0);<BR> =20
maxmaxdis:=3D0;<BR> {for i:=3D1 to n=20
do<BR> =20
=
begin<BR> &nbs=
p;=20
for j:=3D1 t}<BR> for i:=3D1 to n=20
do<BR> for j:=3D1 to n=20
=
do<BR> =
if (map[i,j]<maxlen) and (map[i,j]>maxdis[i])=20
=
then<BR>  =
; =20
maxdis[i]:=3Dmap[i,j];<BR> for i:=3D1 to n=20
do<BR> if =
maxdis[i]>maxmaxdis=20
then maxmaxdis:=3Dmaxdis[i];<BR>end;<BR>procedure=20
work;<BR>var<BR> =
i,j:integer;<BR> =20
min:real;<BR>begin<BR> =20
=
assign(output,'cowtour.out');rewrite(output);<BR> =20
floyd;<BR> maxdistance;<BR> =20
min:=3D1700000000000000000000;<BR> for i:=3D1 to =
n-1=20
do<BR> for j:=3Di+1 to n =
=
do<BR> =
if=20
=
(map[i,j]=3Dmaxlen)and(sqrt(sqr(xy[i,1]-xy[j,1])+sqr(xy[i,2]-xy[j,2]))+ma=
xdis[i]+maxdis[j]<min)then<BR> &nbs=
p; =20
=
min:=3Dsqrt(sqr(xy[i,1]-xy[j,1])+sqr(xy[i,2]-xy[j,2]))+maxdis[i]+maxdis[j=
];<BR> =20
if min>maxmaxdis then writeln(min:0:6)else=20
writeln(maxmaxdis:0:6);<BR> =20
close(output);<BR>end;<BR>begin<BR> =20
init;<BR> work;<BR>end.</STRONG></P><STRONG>
<HR>
</STRONG>
<P><STRONG>USACO=B5=C4=B7=D6=CE=F6</STRONG></P>
<P><STRONG>We do a fair bit of precomputation before choosing the =
path to=20
add. </STRONG></P>
<P><STRONG>First, we calculate the minimum distance between all =
connected=20
points. Then, we use a recursive depth first search to identify =
the=20
different fields. Then we fill in diam[i], which is defined to be =
the=20
distance to the farthest pasture that pasture i is connected to.=20
Fielddiam[j] is the diameter of field j, which is the maximum of =
diam[i]=20
for all pastures i in the field j. </STRONG></P>
<P><STRONG>Once we have all this, selecting a path is simple. If =
we add a=20
path joining pastures i and j which are in different fields, the =
diameter=20
of the new field is the maximum of: </STRONG></P>
<UL>
<LI><STRONG>dist to point farthest from i + dist from i to j + =
dist to=20
point farthest from j. </STRONG>
<LI><STRONG>old diameter of the field containing pasture i. =
</STRONG>
<LI><STRONG>old diameter of the field containing pasture j.=20
</STRONG></LI></UL><PRE><STRONG>#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <math.h>
#define INF (1e40)
typedef struct Point Point;
struct Point {
int x, y;
};
#define MAXPASTURE 150
int n;
double dist[MAXPASTURE][MAXPASTURE];
double diam[MAXPASTURE];
double fielddiam[MAXPASTURE];
Point pt[MAXPASTURE];
int field[MAXPASTURE];
int nfield;
double
ptdist(Point a, Point b)
{
return =
sqrt((double)(b.x-a.x)*(b.x-a.x)+(double)(b.y-a.y)*(b.y-a.y));
}
/* mark the field containing pasture i with number m */
void
mark(int i, int m)
{
int j;
if(field[i] !=3D -1) {
assert(field[i] =3D=3D m);
return;
}
field[i] =3D m;
for(j=3D0; j<n; j++)
if(dist[i][j] < INF/2)
mark(j, m);
}
void
main(void)
{
FILE *fin, *fout;
int i, j, k, c;
double newdiam, d;
fin =3D fopen("cowtour.in", "r");
fout =3D fopen("cowtour.out", "w");
assert(fin !=3D NULL && fout !=3D NULL);
fscanf(fin, "%d\n", &n);
for(i=3D0; i<n; i++)
fscanf(fin, "%d %d\n", &pt[i].x, &pt[i].y);
=20
for(i=3D0; i<n; i++) {
for(j=3D0; j<n; j++) {
c =3D getc(fin);
if(i =3D=3D j)
dist[i][j] =3D 0;
else if(c =3D=3D '0')
dist[i][j] =3D INF; /* a lot */
else
dist[i][j] =3D ptdist(pt[i], pt[j]);
}
assert(getc(fin) =3D=3D '\n');
}
/* Floyd-Warshall all pairs shortest paths */
for(k=3D0; k<n; k++)
for(i=3D0; i<n; i++)
for(j=3D0; j<n; j++)
if(dist[i][k]+dist[k][j] < dist[i][j])
dist[i][j] =3D dist[i][k]+dist[k][j];
/* mark fields */
for(i=3D0; i<n; i++)
field[i] =3D -1;
for(i=3D0; i<n; i++)
if(field[i] =3D=3D -1)
mark(i, nfield++);
/* find worst diameters involving pasture i, and for whole field */
for(i=3D0; i<n; i++) {
for(j=3D0; j<n; j++)
if(diam[i] < dist[i][j] && dist[i][j] < INF/2)
diam[i] =3D dist[i][j];
if(diam[i] > fielddiam[field[i]])
fielddiam[field[i]] =3D diam[i];
}
/* consider a new path between i and j */
newdiam =3D INF;
for(i=3D0; i<n; i++)
for(j=3D0; j<n; j++) {
if(field[i] =3D=3D field[j])
continue;
d =3D diam[i]+diam[j]+ptdist(pt[i], pt[j]);
if(d < fielddiam[field[i]])
d =3D fielddiam[field[i]];
if(d < fielddiam[field[j]])
d =3D fielddiam[field[j]];
=20
if(d < newdiam)
newdiam =3D d;
}
fprintf(fout, "%.6lf\n", newdiam);
exit(0);
}</STRONG></PRE></DIV></TD></TR></TBODY></TABLE><BR>
<DIV class=3Dopt><A =
title=3D=B2=E9=BF=B4=B8=C3=B7=D6=C0=E0=D6=D0=CB=F9=D3=D0=CE=C4=D5=C2=20
href=3D"http://hi.baidu.com/leokan/blog/category/Oi">=C0=E0=B1=F0=A3=BAOi=
</A> | <A=20
href=3D"http://hi.baidu.com/leokan/modify/blog/6c8001d76b8cf3d9a044df08">=
=B1=E0=BC=AD</A> |=20
<A onclick=3D"return blogdel('blogdelform')"=20
href=3D"http://hi.baidu.com/leokan/blog/item/6c8001d76b8cf3d9a044df08.htm=
l#">=C9=BE=B3=FD</A>=20
<FORM id=3Dblogdelform style=3D"DISPLAY: none" name=3Dblogdelform=20
action=3D/leokan/commit method=3Dpost><INPUT type=3Dhidden value=3D1 =
name=3Dct><INPUT=20
type=3Dhidden value=3D3 name=3Dcm><INPUT type=3Dhidden =
value=3D6c8001d76b8cf3d9a044df08=20
name=3DspBlogID><INPUT type=3Dhidden =
value=3Dhttp://hi.baidu.com/leokan/blog=20
name=3DspRefURL></FORM>
<SCRIPT language=3Djavascript>
<!--
function blogdel(str)
{
var pop=3Dnew Popup({ =
contentType:3,isReloadOnClose:false,width:340,height:80});
pop.setContent("title","=C9=BE=B3=FD=CE=C4=D5=C2");
=
pop.setContent("confirmCon","=C4=FA=C8=B7=B6=A8=D2=AA=B3=B9=B5=D7=C9=BE=B3=
=FD=D5=E2=C6=AA=CE=C4=D5=C2=BC=B0=C6=E4=CB=F9=D3=D0=C6=C0=C2=DB=C2=F0=A3=BF=
");
pop.setContent("callBack",delCallback);
pop.setContent("parameter",{fid:str,popup:pop});
pop.build();
pop.show();
return false;
}
function delCallback(para)
{
var o_pop=3Dpara["popup"];
o_pop.config.contentType=3D1;
o_pop.setContent("contentUrl","");
o_pop.reBuild();
G(para["fid"]).target=3Do_pop.iframeIdName;
eval("document."+para["fid"]).submit();
}
//-->
</SCRIPT>
| <A =
title=3D=BD=AB=B4=CB=CE=C4=D5=C2=CC=ED=BC=D3=B5=BD=B0=D9=B6=C8=CB=D1=B2=D8=
onclick=3D"return addToFavor();"=20
href=3D"http://cang.baidu.com/do/add" =
target=3D_blank>=CC=ED=BC=D3=B5=BD=CB=D1=B2=D8</A> | =E4=AF=C0=C0(<SPAN=20
id=3Dresult></SPAN>) | <A=20
href=3D"http://hi.baidu.com/leokan/blog/item/6c8001d76b8cf3d9a044df08.htm=
l#send">=C6=C0=C2=DB</A> (1)
<SCRIPT language=3Djavascript>
/*<![CDATA[*/
var pre =3D [true,'USACO 2.4.4 Bessie Come Home =CC=E2=BD=E2', 'USACO =
2.4.4 Bessie Come Home =
...','/leokan/blog/item/13f45c0f0799b32e6159f379.html'];
var post =3D [true,'USACO 2.4.2 Overfencing =CC=E2=BD=E2','USACO 2.4.2 =
Overfencing =CC=E2=BD=E2', =
'/leokan/blog/item/67be1095bb86660c7af480de.html'];
if(pre[0] || post[0]){
document.write('<div =
style=3D"height:5px;line-height:5px;"> </div><div id=3D"in_nav">');
if(pre[0]){
document.write('=C9=CF=D2=BB=C6=AA=A3=BA<a href=3D"' + pre[3] + '" =
title=3D"' + pre[1] + '">' + pre[2] + '</a> ');
}
if(post[0]){
document.write('=CF=C2=D2=BB=C6=AA=A3=BA<a href=3D"' + post[3] + '" =
title=3D"' + post[1] + '">' + post[2] + '</a>');
}
document.write('</div>');
}
/*]]>*/
</SCRIPT>
</DIV>
<DIV class=3Dline></DIV>
<STYLE type=3Dtext/css>#in_related_doc A {
TEXT-DECORATION: none
}
</STYLE>
<DIV id=3Din_related_tmp></DIV>
<SCRIPT language=3Djavascript type=3Dtext/javascript>
/*<![CDATA[*/
function HI_MOD_IN_RELATED_DOC_CALLBACK(arg){
if(arg.length <=3D 1) return false;
var hasMore =3D arg[0];
var D=3Dfunction(A,B){A[A.length]=3DB;}
if(arg.length % 2 =3D=3D 0) D(arg, ["","","",""]);
var html =3D ['<div id=3D"in_related_doc"><div =
class=3D"tit">=CF=E0=B9=D8=CE=C4=D5=C2=A3=BA</div>'];
D(html, '<table cellpadding=3D"0" cellspacing=3D"3" border=3D"0">');
for(var i =3D 1, j =3D arg.length; i < j; i +=3D 2){
D(html, '<tr>');
D(html, '<td width=3D"15px"><a style=3D"font-size:25px" =
>•</a></td><td><a href=3D"http://hi.baidu.com/' + arg[i][3] + =
'/blog/item/' + arg[i][2] + '.html" target=3D"_blank" title=3D"' + =
arg[i][0] + '">' + arg[i][1] + '</a>');
D(html, new Array(10).join('\u3000'));
D(html, '</td>');
if(arg[i + 1][0] !=3D "")
D(html, '<td width=3D"15px"><a style=3D"font-size:25px" =
>•</a></td><td><a href=3D"http://hi.baidu.com/' + arg[i + 1][3] + =
'/blog/item/' + arg[i + 1][2] + '.html" target=3D"_blank" title=3D"' + =
arg[i + 1][0] + '">' + arg[i + 1][1] + '</a></td>');
else
D(html, '<td> </td><td> </td>');
D(html, '</tr>');
}
if(hasMore) D(html, '<tr><td colspan=3D"4"><a target=3D"_blank" =
href=3D"/sys/search?pageno=3D1&type=3D7&sort=3D1&word=3DUSACO%202%2E4%2E3=
%20Cow%20Tours%20%CC%E2%BD%E2&item=3D6c8001d76b8cf3d9a044df08">=B8=FC=B6=E0=
>></a></td></tr>');
D(html, '</table></div><div class=3D"line"> </div>');
var div =3D document.getElementById('in_related_tmp');
if(div){
div.innerHTML =3D html.join('');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -