Bessie Come Home回家
(comehome.pas)
【问题描述】
现在是晚餐时间,而母牛们在外面分散的牧场中。农民约翰按响了电铃,所以她们开始向谷仓走去。你的工作是要指出哪只母牛会最先到达谷仓(在给出的测试数据中,总会有且只有一只最快的母牛)。在挤奶的时候(晚餐前),每只母牛都在她自己的牧场上,一些牧场上可能没有母牛。每个牧场由一条条道路和一个或多个牧场连接(可能包括自己)。有时,两个牧场(可能是字母相同的)之间会有超过一条道路相连。至少有一个牧场和谷仓之间有道路连接。因此,所有的母牛最后都能到达谷仓,并且母牛总是走最短的路径。当然,母牛能向着任意一方向前进,并且她们以相同的速度前进。牧场被标记为'a'..'z'和'A'..'Y',在用大写字母表示的牧场中有一只母牛,小写字母中则没有。谷仓的标记是'Z',注意没有母牛在谷仓中。
注意'm'和'M'不是同一个牧场 否则错误 上面的意思是说:输入数据中可能会同时存在M,m(郁闷ing),比如
M a a m m z
【输入格式】(comehome.in)
第 1 行: 整数 P(1<= P<=10000),表示连接牧场(谷仓)的道路的数目。
第 2 ..P+1行: 用空格分开的两个字母和一个整数:
被道路连接牧场的标记和道路的长度(1<=长度<=1000)。
【输出格式】(comehome.out)
单独的一行包含二个项目: 最先到达谷仓的母牛所在的牧场的标记,和这只母牛走过的路径的长度。
【样例输入】(comehome.in)
5
A d 6
B d 3
C e 9
d Z 8
e Z 3
【样例输出】
B 11
【思路分析】
此题可以简化为一个求最短路的算法:
把‘Z’ 点当做一个根节点然后用迪斯卡尔算法求到每一个‘A'..’Y' 中最小值即可!!
【参考程序】
var dist:array['A'..'z','A'..'z'] of longint;
n,m,max,d,min:longint;
v:array['A'..'z'] of boolean;
vv:array['A'..'Z'] of boolean;
i,j,k:char;
ch1,ch2,ch:char;
begin
assign(input,'comehome.in');reset(input);
assign(output,'comehome.out');rewrite(output);
readln(n);
fillchar(vv,sizeof(vv),false);
fillchar(v,sizeof(v),false);
for d:=1 to n do
begin
readln(ch1,ch,ch2,min);
if (dist[ch1,ch2]<>0)and(dist[ch1,ch2]0)and(dist[ch1,ch2]>min) then dist[ch1,ch2]:=min;
if dist[ch1,ch2]=0 then dist[ch1,ch2]:=min;
dist[ch2,ch1]:=dist[ch1,ch2];
if (ch1>='A')and(ch1<='Z') then
vv[ch1]:=true;
end;
v['Z']:=true;
for i:='A' to 'z' do
begin
if (ord(i)>90)and(ord(i)<97) then continue;
max:=maxlongint;
for j:='A' to 'z' do
if (dist['Z',j]<>0)and(dist['Z',j]0 then
if (dist['Z',k]+dist[k,j]0) then
begin
k:=i;
min:=dist['Z',i];
end;
end;
writeln(k,' ',min);
close(input); close(output);
end.