文化之旅

题目描述

这里写图片描述

输入

这里写图片描述

输出

这里写图片描述

样例输入

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.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值