码迷,mamicode.com
首页 > 其他好文 > 详细

文化之旅

时间:2015-08-06 22:08:16      阅读:94      评论:0      收藏:0      [点我收藏+]

标签:

题目描述 Description

有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家)。不同的国家可能有相同的文化。不同文化的国家对其他文化的看法不同,有些文化会排斥外来文化(即如果他学习了某种文化,则他不能到达排斥这种文化的其他国家)。

现给定各个国家间的地理关系,各个国家的文化,每种文化对其他文化的看法,以及这位使者游历的起点和终点(在起点和终点也会学习当地的文化),国家间的道路距离,试求从起点到终点最少需走多少路。

输入描述 Input Description

第一行为五个整数N,K,M,S,T,每两个整数之间用一个空格隔开,依次代表国家个数(国家编号为1到N),文化种数(文化编号为1到K),道路的条数,以及起点和终点的编号(保证S不等于T);

第二行为N个整数,每两个整数之间用一个空格隔开,其中第i个数Ci,表示国家i的文化为Ci。

接下来的K行,每行K个整数,每两个整数之间用一个空格隔开,记第i行的第j个数为aij,aij= 1表示文化i排斥外来文化j(i等于j时表示排斥相同文化的外来人),aij= 0表示不排斥(注意i排斥j并不保证j一定也排斥i)。

接下来的M行,每行三个整数u,v,d,每两个整数之间用一个空格隔开,表示国家u与国家v有一条距离为d的可双向通行的道路(保证u不等于v,两个国家之间可能有多条道路)。

输出描述 Output Description

输出只有一行,一个整数,表示使者从起点国家到达终点国家最少需要走的距离数(如果无解则输出-1)。

样例输入 Sample Input

输入样例1

2 2 1 1 2

1 2

0 1

1 0

1 2 10

 

输入样例2

2 2 1 1 2

1 2

0 1

0 0

1 2 10

 

样例输出 Sample Output

输出样例1

-1

 

输出样例2

10

 

数据范围及提示 Data Size & Hint

【输入输出样例1说明】

由于到国家2必须要经过国家1,而国家2的文明却排斥国家1的文明,所以不可能到达国家2。

【输入输出样例2说明】

路线为1 -> 2。

【数据范围】

对于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%的数据,有2≤N≤100,1≤K≤100,1≤M≤N2,1≤ki≤K,1≤u,v≤N,1≤d≤1000,S≠T,1 ≤S, T≤N。

 

 1 const max=100;  
 2  2 var a,b:array[0..max,0..max] of longint;  
 3  3     ll:array[1..max,1..max] of longint;  
 4  4     c:array[1..max] of longint;  
 5  5     f:array[1..max] of boolean;  
 6  6     path:array[1..max] of longint;  
 7  7     dist:array[1..max] of longint;  
 8  8     n,k,m,s,t,u,v,d:longint;  
 9  9     i,j:longint;  
10 10     head,tail:longint;  
11 11     now:longint;  
12 12 begin  
13 13   readln(n,k,m,s,t);  
14 14   for i:=1 to max do  
15 15     path[i]:=maxint;  
16 16   fillchar(dist,sizeof(dist),0);  
17 17   fillchar(f,sizeof(f),false);  
18 18   for i:=1 to n do read(c[i]);  
19 19   for i:=1 to k do  
20 20    for j:=1 to k do  
21 21     begin  
22 22      read(ll[i,j]);  
23 23     end;  
24 24   for i:=1 to m do  
25 25    begin  
26 26     read(u,v,d);  
27 27     inc(b[u,0]);  
28 28     b[u,b[u,0]]:=v;  
29 29     a[u,v]:=d;  
30 30     inc(b[v,0]);  
31 31     b[v,b[v,0]]:=u;  
32 32     a[v,u]:=d;  
33 33    end;  
34 34   path[s]:=0;  
35 35   f[s]:=true;  
36 36   dist[1]:=s;  
37 37   head:=1;  
38 38   tail:=1;  
39 39   while head<=tail do  
40 40    begin  
41 41      now:=dist[head];  
42 42      for i:=1 to b[now,0] do  
43 43       if ll[c[now],c[i]]=0 then  
44 44       if path[b[now,i]]>path[now]+a[now,b[now,i]] then  
45 45        begin  
46 46         path[b[now,i]]:=path[now]+a[now,b[now,i]];  
47 47         if not f[b[now,i]] then  
48 48          begin  
49 49           inc(tail);  
50 50           dist[tail]:=b[now,i];  
51 51           f[b[now,i]]:=true;  
52 52          end;  
53 53        end;  
54 54       f[now]:=false;  
55 55       inc(head);  
56 56    end;  
57 57    if path[t]<maxint then writeln(path[t])  
58 58    else writeln(-1);  
59 59 end.  

 

文化之旅

标签:

原文地址:http://www.cnblogs.com/yangqingli/p/4709249.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!