zoukankan      html  css  js  c++  java
  • COGS 705——回家

    描述 USACO 2.4.4

    现在是晚餐时间,而母牛们在外面分散的牧场中。 农民约翰按响了电铃,所以她们开始向谷仓走去。 你的工作是要指出哪只母牛会最先到达谷仓(在给出的测试数据中,总会有且只有一只最快的母牛)。 在挤奶的时候(晚餐前),每只母牛都在她自己的牧场上,一些牧场上可能没有母牛。 每个牧场由一条条道路和一个或多个牧场连接(可能包括自己)。 有时,两个牧场(可能是字母相同的)之间会有超过一条道路相连。 至少有一个牧场和谷仓之间有道路连接。 因此,所有的母牛最后都能到达谷仓,并且母牛总是走最短的路径。 当然,母牛能向着任意一方向前进,并且她们以相同的速度前进。 牧场被标记为'a'..'z'和'A'..'Y',在用大写字母表示的牧场中有一只母牛,小写字母中则没有。 谷仓的标记是'Z',注意没有母牛在谷仓中。


    注意'm'和'M'不是同一个牧场 否则错误 上面的意思是说:输入数据中可能会同时存在M,m(郁闷ing),比如

    M a a m m z


    格式

    PROGRAM NAME: comehome

    INPUT FORMAT

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

    第 2 ..P+1行: 用空格分开的两个字母和一个整数:

    被道路连接牧场的标记和道路的长度(1<=长度<=1000)。


    SAMPLE INPUT

    (file comehome.in)

    5
    A d 6
    B d 3
    C e 9
    d Z 8
    e Z 3
    

    OUTPUT FORMAT

    单独的一行包含二个项目: 最先到达谷仓的母牛所在的牧场的标记,和这只母牛走过的路径的长度。


    SAMPLE OUTPUT

    (file comehome.out)

    B 11

    显然这是一道最短路的图论题
    我用的是dijkstra算法:
     1 program p1138;
     2 var
     3   p,n,kk,ii,min:longint;
     4   b,c,kg,i,j,k,ans:char;
     5   a:array['A'..'z','A'..'z'] of longint;
     6   d:array['A'..'z'] of longint;
     7   f:array['A'..'z'] of boolean;
     8 begin
     9 assign(input,'comehome.in');
    10 reset(input);
    11 assign(output,'comehome.out');
    12 rewrite(output);
    13   for i:='A' to 'z' do
    14    for j:='A' to 'z' do
    15     if i=j then a[i,j]:=0 else a[i,j]:=maxlongint div 2;
    16   readln(p);
    17   for ii:=1 to p do
    18    begin
    19      readln(b,kg,c,kk);
    20       if b=c then begin a[b,c]:=0; a[c,b]:=0; end else
    21      a[b,c]:=kk;
    22      a[c,b]:=kk;
    23    end;
    24    for i:='A' to 'z' do
    25     begin d[i]:=a['Z',i]; f[i]:=false; end;
    26    f['Z']:=true;
    27    for i:='A' to 'z' do
    28     begin
    29       min:=maxlongint; k:=' ';
    30       for j:='A' to 'z' do
    31        if (not f[j]) and (d[j]<min) then
    32         begin min:=d[j]; k:=j; end;
    33       if (k=' ') or (min=maxlongint) then break;
    34       f[k]:=true;
    35       for j:='A' to 'z' do
    36         if (not f[j]) and (d[k]+a[k,j]<d[j]) and (j<>'Z') then d[j]:=d[k]+a[k,j];
    37     end;
    38    min:=maxlongint div 2;
    39    for i:='A' to 'Y' do
    40     if d[i]<min then begin min:=d[i]; ans:=i; end;
    41   writeln(ans,' ',d[ans]);
    42 end.
    
    

    可是第七个点怎么也过不去

    当我改成:

     1 program p1138;
     2 var
     3   p,n,kk,ii,min:longint;
     4   b,c,kg,i,j,k,ans:char;
     5   a:array['A'..'z','A'..'z'] of longint;
     6   d:array['A'..'z'] of longint;
     7   f:array['A'..'z'] of boolean;
     8 begin
     9 assign(input,'comehome.in');
    10 reset(input);
    11 assign(output,'comehome.out');
    12 rewrite(output);
    13   for i:='A' to 'z' do
    14    for j:='A' to 'z' do
    15     if i=j then a[i,j]:=0 else a[i,j]:=maxlongint div 2;
    16   readln(p);
    17   for ii:=1 to p do
    18    begin
    19      readln(b,kg,c,kk);
    20       if kk<a[b,c] then begin
    21      a[b,c]:=kk;
    22      a[c,b]:=kk;        end;
    23    end;
    24    for i:='A' to 'z' do
    25     begin d[i]:=a['Z',i]; f[i]:=false; end;
    26    f['Z']:=true;
    27    for i:='A' to 'z' do
    28     begin
    29       min:=maxlongint; k:=' ';
    30       for j:='A' to 'z' do
    31        if (not f[j]) and (d[j]<min) then
    32         begin min:=d[j]; k:=j; end;
    33       if (k=' ') or (min=maxlongint) then break;
    34       f[k]:=true;
    35       for j:='A' to 'z' do
    36         if (not f[j]) and (d[k]+a[k,j]<d[j]) and (j<>'Z') then d[j]:=d[k]+a[k,j];
    37     end;
    38    min:=maxlongint div 2;
    39    for i:='A' to 'Y' do
    40     if d[i]<min then begin min:=d[i]; ans:=i; end;
    41   writeln(ans,' ',d[ans]);
    42 end.

    20--22行有变动

    这并不是说明数据中有超过maxlongint div 2 的距离(这还用你说(#‵′)凸)

    而是说明数据有重复边。。

    读题要考虑周全。

  • 相关阅读:
    Excel教程(5)
    Excel教程(4)
    Excel教程(3)
    Excel教程(2)
    如何在Excel中少犯二(I)
    for zip
    temp
    study
    eclipse
    shell
  • 原文地址:https://www.cnblogs.com/vacation/p/4855045.html
Copyright © 2011-2022 走看看