Bessie Come Home回家 NOIP题解

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.

你可能感兴趣的:(NOIP算法,算法,数据结构)