您的位置:首页 > 其它

Bessie Come Home_usaco2.4.4_floyd

2016-07-10 15:24 218 查看

[题目描述]

现在是晚餐时间,而母牛们在外面分散的牧场中。农民约翰按响了电铃,所以她们开始向谷仓走去。

你的工作是要指出哪只母牛会最先到达谷仓(在给出的测试数据中,总会有且只有一只速度最快的母牛)。

在挤奶的时候(晚餐前),每只母牛都在她自己的牧场上,一些牧场上可能没有母牛。每个牧场由一条条道路和一个或多个牧场连接(可能包括自己)。

有时,两个牧场(可能是自我相同的)之间会有超过一条道路相连。

至少有一个牧场和谷仓之间有道路连接。

因此,所有的母牛最后都能到达谷仓,并且母牛总是走最短的 路径。

当然,母牛能向着任意一方向前进,并且她们以相同的速度前进。

牧场被标记为’a’..’z’和’A’..’Y’,在用大写字母表示的牧场中有一只母牛,小写字母中则没有。

谷仓的标记是’Z’,注意没有母牛在谷仓中。

[输入格式]

第 1 行:整数 P(1<= P<=10000),表示连接牧场(谷仓)的道路的数目。

第 2 ..P+1行: 用空格分开的两个字母和一个整数:被道路连接牧场的标记和道路的长度(1<=长度<=1000)。

[输入样例]

5

A d 6

B d 3

C e 9

d Z 8

e Z 3

[输出格式]

单独的一行包含二个项目:

最先到达谷仓的母牛所在的牧场的标记,和这只母牛走过的路径的长度。

[输出样例]

B 11

题解

很霸气地打了个spfa上去WA了

回来仔细一想发现点数最多只有26+26=52个,Floyd?

可以直接用字符作为数组下标,最后找到距离’Z’最近的大写字母点就好了

代码

var
map:array['A'..'z','A'..'z']of longint;
procedure floyd;
var
i,j,k,v:char;
min:longint;
begin
for k:='A' to 'z' do
for i:='A' to 'z' do
if (i<>k) then
for j:='A' to 'z' do
if (k<>j)and(i<>j) then
if (map[i,k]+map[k,j]<map[i,j]) then
map[i,j]:=map[i,k]+map[k,j];
min:=maxlongint;
for i:='A' to 'Y' do
if map[i,'Z']<min then
begin
min:=map[i,'Z'];
v:=i;
end;
writeln(v,' ',min);
end;
procedure init;
var
n,i,w:longint;
x,y,t:char;
begin
fillchar(map,sizeof(map),$7f div 2);
readln(n);
for i:=1 to n do
begin
readln(x,t,y,w);
if map[x,y]>w then
begin
map[x,y]:=w;
map[y,x]:=w;
end;
end;
end;
begin
init;
floyd;
end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: