题目描述
输入
输出
样例输入
2 2 1 2 1
1 2
0 1
1 0
1 2 10
样例输出
-1
数据范围限制
对于 20% 的数据,有 的数据,有 的数据,有 2≤N≤8,K≤5;
对于 30% 的数据,有 的数据,有 的数据,有 2≤N≤10 ,K≤5;
对于 50% 的数据,有 的数据,有 的数据,有 2≤N≤20,K≤8;
对于 70% 的数据,有 的数据,有 的数据,有 2≤N≤100 ,K≤10 ;
对于 100%100% 的数据,有 的数据,有 的数据,有 的数据,有 2≤N≤100,1≤K≤100 ,1≤M≤N2,1≤ki≤K,1≤u, v≤N,1≤d≤10001000 , S≠T,1 ≤S, T≤N。
提示
思路:
深搜+剪枝(最短路不是正解,是水法)
这题剪枝是重点,
首先要明白几个道理:
1、如果当前走的路程已经比最少的多,那么就不用走了;
2、如果走到某一个国家,已经比那个国家记录的最小值大了,那么就不用走了。
代码:
uses math;
var
n,k,m,p,q,i,j,x,y,z,s,ls:longint;
b,lu:array[0..1001,0..1001]of longint;
lai:array[0..1001]of boolean;
wen,dang,f:array[0..1001]of longint;
function pd(x:longint):boolean;
var
i:longint;
begin
for i:=1 to dang[0] do
if b[wen[x],dang[i]]=1 then exit(false);
exit(true);
end;
procedure dg(o,t:longint);
var
i,j,x,y,z,ls:longint;
begin
if t>s then exit;
if f[o]<t then exit;
f[o]:=t;
if o=q then
begin
if t<s then s:=t;
exit;
end;
for i:=1 to n do
if (i<>o)and(lu[o,i]>0)and(lai[i]=false)and pd(i) and(t+lu[o,i]<=s) then
begin
lai[i]:=true;
inc(dang[0]);
dang[dang[0]]:=wen[i];
dg(i,t+lu[o,i]);
dec(dang[0]);
lai[i]:=false;
end;
end;
begin
assign(input,'culture.in');
reset(input);
assign(output,'culture.out');
rewrite(output);
read(n,k,m,p,q);
for i:=1 to n do
read(wen[i]);
for i:=1 to k do
for j:=1 to k do
read(b[i,j]);
for i:=1 to m do
begin
read(x,y,z);
if lu[x,y]<>0 then
begin
lu[x,y]:=min(lu[x,y],z);
lu[y,x]:=lu[x,y];
end
else
begin
lu[x,y]:=z;
lu[y,x]:=z;
end;
end;
for i:=1 to n do
f[i]:=maxlongint;
s:=maxlongint;
dang[0]:=1;
dang[1]:=wen[p];
dg(p,0);
if s=maxlongint then writeln(-1)
else writeln(s);
end.