【普组模拟赛】马语翻译
题目:
随着马场的繁荣,出现了越来越多的新马种。种族之间的沟通不畅严重影响了马场的和谐。这时,科学家发明了马语翻译机器人,正好可以解决这一难题。
机器人有 M 种,每种机器人能完成 K 个马种之间的语言翻译。问,利用这些机器人,能否实现 1 种群和 N 种群的马语翻译。 若可以,找到翻译过程至少需要用到多少种语言。
比赛时打了一个FLOYED水分
听说可以打SPFA,但我打了个DP
设f[i]表示从第1种语言翻译到第i种语言最少需要经过多少种语言
一开始f都是maxlongint
f[1]=1
每次去扫一遍每个机器人所能翻译的语言
看那个的f最小
用一个x记录下来
接着其他的全都等于min(f[i],f[x]+1)
不停的尝试更新,直到没有更新为止
输出f[n]
标程(请勿抄袭,后果很严重):
var f:array[0..100000]of longint;
a:array[1..1000,1..1000]of longint;
n,k,m,i,j,l,s,x:longint;
begin
assign(input,'trans.in');
assign(output,'trans.out');
reset(input);
rewrite(output);
readln(n,k,m);
for i:=1 to m do
for j:=1 to k do
read(a[i,j]);
for i:=2 to n do
f[i]:=maxlongint;
f[1]:=1;
repeat
x:=0;
for i:=1 to m do
begin
s:=maxlongint;
for j:=1 to k do
if f[a[i,j]]<s then s:=f[a[i,j]];
if s<>maxlongint then
begin
for j:=1 to k do
if f[a[i,j]]>s+1 then
begin
f[a[i,j]]:=s+1;
inc(x);
end;
end;
end;
until x=0;
if f[n]=maxlongint then writeln(-1)
else
writeln(f[n]);
close(input);
close(output);
end.