大榕树——让我们共成长!
大榕树 myDrs.org
您的位置:大榕树 \ 编程       |  Logo语言   |  Pascal语言   |  信息学奥赛   |  高考保送    |  HTML版本
|  信息学奥赛>>解题报告>>《哈利·波特与魔法石》         本站全文搜索: 友情提示:

《哈利·波特与魔法石》
http://www.mydrs.org  5/17/2002  大榕树


题目描述

  在Super Samuel星球上,有n个城市,每两个城市都可以直接或间接到达,城市之间的路存在着不同的地形,通过每种地形所需时间是不同的,而且时间是固定的,但是路的长短却并不重要。如果路上有魔法石的话,则通过该路的时间将会减半。(如果城市1与城市2之间有路,我们认为城市1可以直接到城市2,城市2也可以直接到城市1)。现在求从a城市和 b城市最少需要花费多少时间。
算法分析

  这是一道典型求最短路径的题目。
  由于题目上说每两个城市之间的路最多只有一条,那么我们就可以用Road[i,j]来存放从城市i到城市j所需的时间。Road[i,j]如果为0,则代表从城市i不能直接到城市j 。而对于路a----b来说,我们可以知道通过路所在地形所花去的时间,如果这种地形有魔法石,则将时间减半。在所有城市之间的地图构造好之后,我们就可以利用Dijstra算法求出从城市a到城市b所需的最短时间了。
  至此,本题已经得到圆满的解决
程序如下:

Const
  InFile = 'AH02T7.in';
  OutFile = 'AH02T7.out';
  Limit = 102;
  MaxLongint = 10000000;
  cost : array[1..7] of longint
     = (2 , 6 , 4 , 8 , 6 , 10 , 14);
Type
  Tmap = array[1..Limit , 1..Limit] of longint;
  Tappeared = array[1..Limit] of boolean;
  Tshortest = array[1..Limit] of longint;
Var
  map : Tmap;
  appeared : Tappeared;
  shortest : Tshortest;
  start ,
  stop : longint;
procedure init;                   // 初始化
type
  Tdata = array[1..7] of longint;
var
  data : Tdata;
  i ,
  p1 , p2 ,
  k , total : longint;
begin
  fillchar(appeared , sizeof(appeared) , 0);
  for p1 := 1 to Limit do
   for p2 := 1 to Limit do
    map[p1 , p2] := maxlongint;
  assign(INPUT , InFile); ReSet(INPUT);
   for i := 1 to 7 do
    begin
      read(data[i]);
      inc(data[i]);
    end;
   read(start , stop , total);
   for i := 1 to total do
    begin
       read(p1 , p2 , k);
       map[p1 , p2] := cost[k] div data[k];
       map[p2 , p1] := cost[k] div data[k];
       appeared[p1] := true;
       appeared[p2] := true;
    end;
  Close(INPUT);
end;
procedure work; {Dijkstra}           // 求从a到b的最短路径
type
  Tvisited = array[1..Limit] of boolean;
var
  visited : Tvisited;
  i , min : longint;
begin
  fillchar(visited , sizeof(visited) , 0);
  for i := 1 to Limit do
   shortest[i] := map[start , i];
  shortest[start] := 0;
  while not visited[stop] do
   begin
     min := 0;
     for i := 1 to Limit do
      if appeared[i] and not visited[i] then
       if (min = 0) or (shortest[min] > shortest[i]) then
        min := i;
     visited[min] := true;
     for i := 1 to Limit do
      if appeared[i] and not visited[i] then
       if shortest[min] + map[min , i] < shortest[i] then
        shortest[i] := shortest[min] + map[min , i];
   end;
end;
procedure out;                    // 输出
begin
  assign(OUTPUT , OutFile); ReWrite(OUTPUT);
   writeln(shortest[stop]);
  Close(OUTPUT);
end;
Begin
  init;
  work;
  out;
End.


来 源:曙光
共有5085位读者阅读过此文

  • 上篇文章Sgoi12之《网络传输》
  • 下篇文章《Kitty猫基因突变》

  • 发送邮件
    保存页面 打印文章 HTML版本 发表评论

    □- 近期热门文章 □- 相关文章
    1. NOIP2006竞赛大纲 [8307]
    2. 七类高中生具有保送资格 [5911]
    3. NOI2006获奖选手名单 [4956]
    4. 关于举办NOIP2006模拟赛的通告 [4107]
    5. Turbo Pascal各语句运行速... [3595]
    6. Turbo王者归来新Delphi免费... [3182]
    7. IOI2006我国4名选手全部获得金... [2946]
    8. 关于APIO2007与IOI2007... [2764]
    9. noip倒计时 by 枯叶蝴蝶 [2684]
    10. 朱泽园:思想上的金牌更重要 [2169]
    SGOI第14次友谊赛成绩
    SGOI-14友谊赛测试数据
    SGOI14友谊赛试题
    SGOI第十三次友谊赛数据
    SGOI第13次友谊赛成绩揭晓
    SGOI第十三次友谊赛试题
    SGOI第13次友谊赛竞赛规则
    Sgoi12之《黑白瓷砖》
    《哈利·波特与魔法石》
    Sgoi12之《网络传输》
     

    关于本站 | 合作伙伴 | 联系方式
    大榕树 版权所有 ©1999-2006 www.myDrs.org 闽ICP备05000721号