TYVJ1579(选选地址)

算法:最短路
其实这道题就是一道简单的最短路+枚举,用Floyd求出每两个点之间的距离,最后枚举一遍设置城市的点,选一个最小值即可。

不知道当时考试的时候为什么错了……难道是没开无向图?

program P1579;

const
  maxn=200;

var
  n,min,p:longint;
  a:array [0..maxn] of longint;
  d:array [0..maxn,0..maxn] of longint;
  
procedure init;
var
  i,j,t:longint;
begin
  fillchar(d,sizeof(d),100);
  readln(n);
  for i:=1 to n do
    begin
      for j:=1 to n do
        begin
          read(t);
          if t<>0 then
            begin
              d[i,j]:=t;
              d[j,i]:=t;
            end;
        end;
      readln;
    end;
  for i:=1 to n do readln(a[i]);
end;

procedure floyd;
var
  i,j,k:longint;
begin
  min:=maxlongint;
  for k:=1 to n do
    begin
      for i:=1 to n do
        begin
          for j:=1 to n do
            begin
              if (i<>j) and (i<>k) and (k<>j) and (d[i,k]+d[k,j]>0) and (d[i,k]+d[k,j]<d[i,j]) then
                begin
                  d[i,j]:=d[i,k]+d[k,j];
                  d[j,i]:=d[i,j];
                end;
            end;
        end;
    end;
end;

procedure main;
var
  i,j,temp:longint;
begin
  min:=maxlongint;
  for i:=1 to n do
    begin
      temp:=0;
      for j:=1 to n do if (i<>j) then inc(temp,d[i,j]*a[j]);
      if temp<min then
        begin
          min:=temp;
          p:=i;
        end;
    end;
end;

begin
  assign(input,'P1579.in'); reset(input);
  assign(output,'P1579.out'); rewrite(output);
  
  init;
  floyd;
  main;
  writeln(p);
  writeln(min);
  
  close(input); close(output);
end.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值