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