noip2012普及组复赛 文化之旅 求Free Pascal 代码(最好带解释)

noip2012普及组复赛 文化之旅 求Free Pascal 代码(最好带解释)
4.文化之旅
(culture.cpp/c/pas)
【问题描述】
有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一
种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家) 。不
同的国家可能有相同的文化。不同文化的国家对其他文化的看法不同,有些文化会排斥外来
文化(即如果他学习了某种文化,则他不能到达排斥这种文化的其他国家) 。
现给定各个国家间的地理关系,各个国家的文化,每种文化对其他文化的看法,以及这
位使者游历的起点和终点(在起点和终点也会学习当地的文化),国家间的道路距离,试求
从起点到终点最少需走多少路。

【输入】
输入文件culture.in。
第一行为五个整数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,两个国家之间可能有多条
道路)。

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

【输入输出样例1】
culture.in
2 2 1 1 2
1 2
0 1
1 0
1 2 10
culture.out
-1
【输入输出样例说明】
由于到国家2必须要经过国家1,而国家2的文明却排斥国家 1的文明,所以不可能到
达国家2。
【输入输出样例2】
culture.in
2 2 1 1 2
1 2
0 1
0 0
1 2 10
culture.out
10
【输入输出样例说明】
路线为1 -> 2。

【数据范围】
对于20%的数据,有2≤N≤8,K≤5;
对于30%的数据,有2≤N≤10,K≤5;
对于50%的数据,有2≤N≤20,K≤8;
急!急!急!
好的给加分。
二鸣 1年前 已收到1个回答 举报

漂泊先生 幼苗

共回答了13个问题采纳率:92.3% 举报

procedure DFS (nowcity, nowdist, culture)
begin
if nowcity = t then //是否到达目标城市
do
if nowdist < ans then ans := nowdist; //比当前答案小就更新
exit //退出
end
if nowdist > ans then exit //剪枝1,比当前答案大就退出.
for each E(nowcity, nextcity) //枚举每条当前城市的出边
if nextcity ∉ cultrue then //如果到达的城市没有被登记过
do
Add nextcity to culture //登记到达的城市,并且将到达的城市所影响 Add cities influenced to culture 的城市也登记上)
DFS(nextcity, nowdist + dist(nowcity, nextcity), culture) //继续搜索
Clear culture //回溯操作.
end
end;
注:是pascal伪代码

1年前

9
可能相似的问题
Copyright © 2024 YULUCN.COM - 雨露学习互助 - 16 q. 0.009 s. - webmaster@yulucn.com