汤姆斯的天堂梦(par)

 

汤姆斯的天堂梦(par)

  【问题描述】

  汤姆斯生活在一个等级为0的星球上。那里的环境极其恶劣,每天12小时的工作和成堆的垃圾让人忍无可忍。他向往着等级为N的星球上天堂般的生活。

有一些航班将人从低等级的星球送上高一级的星球,有时需要向驾驶员支付一定金额的费用,有时却又可以得到一定的金钱。

汤姆斯预先知道了从0等级星球去N等级星球所有的航线和需要支付(或者可以得到)的金钱,他想寻找一条价格最低(甚至获得金钱最多)的航线。

【输入】

第一行一个正整数N(N≤100),接下来的数据可分为N个段落每段的第一行一个整数Ki(Ki≤100),表示等级为i的星球有Ki个。

接下来的Ki中第Tij行依次表示与等级为i,编号为i的星球相连的等级为i-l的星球的编号和此航线需要的费用(正数表示支出,负数表示收益,费用的绝对值不超过1000)。

每行以0结束,每行的航线数≤100。

【输出】

输出所需(或所得)费用。正数表示支出,负数表示收益。

【输入样例】

  3

  2

  1 15 0

  1 5 0

  3

  1 -5 2 10 0

   1 3 0

   2 40 0

   2

   1 1 2 5 3 -5 0

   2 -19 3 -20 0

【输出样例】

   -1

【数据范围】

对于100%的数据N≤100 Ki≤100。

【样例解释】

如右图 

=================================

可能有双边...三边....四边...n边...这个要判断...

=======================

  

{
ID:jie19952
PROG:
LANG:PASCAL
}
var
  n:longint;
  map:array[0..100,0..100,0..100]of longint;
  bool_map:array[0..100,0..100,0..100]of boolean;
  map_num:array[0..100]of longint;      //表示每层有多少个..
  f:array[0..100,0..100]of longint;
procedure init;
begin
  assign(input,'par.in');
  assign(output,'par.out');
  reset(input); rewrite(output);
end;

procedure terminate;
begin
  close(input); close(output);
  halt;
end;

procedure main;
var
  i,j,k:longint;
  x,t:longint;
  ans:longint;
begin
  readln(n);
  fillchar(bool_map,sizeof(bool_map),false);
  map_num[0]:=1;
  for i:=1 to n do
    begin
      readln(map_num[i]);                //表示第i层有多少个..
      for j:=1 to map_num[i] do
        begin
          read(x);
          while x<>0 do
            begin
              read(t);           //表示第i层的第j个与i-1层的第x个
              if bool_map[i,j,x] then
                begin
                  if t<map[i,j,x] then map[i,j,x]:=t;
                end
                else map[i,j,x]:=t;
              bool_map[i,j,x]:=true;
              read(x);
            end;
        end;
    end;
  f[0,1]:=0;
  for i:=1 to n do
    begin
      for j:=1 to map_num[i] do
        begin
          f[i,j]:=maxlongint;
          for k:=1 to map_num[i-1] do
          if bool_map[i,j,k] then
            begin
              if f[i,j]>f[i-1,k]+map[i,j,k] then
                f[i,j]:=f[i-1,k]+map[i,j,k];
            end;
        end;
    end;
  ans:=maxlongint;
  for i:=1 to map_num[n] do
    if f[n,i]<ans then ans:=f[n,i];
  writeln(ans);
end;

begin
  init;
  main;
  terminate;
end.


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值