描述

有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次,即如果他学习了某种文化,则他就不能到达其他有这种文化的国家。不同的国家可能有相同的文化。不同文化的国家对其他文化的看法不同,有些文化会排斥外来文化,即如果他学习了某种文化,则他不能到达排斥这种文化的其他国家。 现给定各个国家间的地理关系,各个国家的文化,每种文化对其他文化的看法,以及这位使者游历的起点和终点(在起点和终点也会学习当地的文化),国家间的道路距离,试求从起点到终点最少需走多少路。

输入

第一行为五个整数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,两个国家之间可能有多条道路。

对于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≤N^2,1≤ki≤K,1≤u,v≤N,1≤d≤1000,S≠T,1≤S,T≤N。

输出

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

样例输入

2 2 1 1 2
1 2
0 1
1 0
1 2 10

样例输出

-1

题意

每个国家有一种文化,使者在一个国家会学习当地的文化,使者不会去他已经学过的文化的国家,问从S到T的最短路是多少

题解

floyd先不考虑文化问题处理出d[i][j]的最短路

在dfs搜所有路径,如果当前到u的距离dis+最短的u到终点T>=ans,说明这条路径不行了

代码

 #include<bits/stdc++.h>
using namespace std; const int maxn=;
int N,K,M,S,T,u,v,w,ans;
int a[maxn][maxn],d[maxn][maxn],G[maxn][maxn],c[maxn];
bool vis[maxn]; void dfs(int u,int dis)
{
if(dis+d[u][T]>=ans)return;
if(u==T)
{
ans=min(ans,dis);
return;
}
for(int v=;v<=N;v++)
{
if(!a[c[v]][c[u]]&&!vis[c[v]])
{
vis[c[v]]=true;
dfs(v,dis+G[u][v]);
vis[c[v]]=false;
}
}
}
int main()
{
memset(d,0x3f3f3f3f,sizeof d);
memset(G,0x3f3f3f3f,sizeof G);
scanf("%d%d%d%d%d",&N,&K,&M,&S,&T);
for(int i=;i<=N;i++)
scanf("%d",&c[i]),G[i][i]=d[i][i]=;
for(int i=;i<=K;i++)
for(int j=;j<=K;j++)
scanf("%d",&a[i][j]);
for(int i=;i<=M;i++)
{
scanf("%d%d%d",&u,&v,&w);
if(!a[c[u]][c[v]]&&c[u]!=c[v])G[v][u]=d[v][u]=min(d[v][u],w);
if(!a[c[v]][c[u]]&&c[u]!=c[v])G[u][v]=d[u][v]=min(d[u][v],w);
}
for(int k=;k<=N;k++)
for(int i=;i<=N;i++)
for(int j=;j<=N;j++)
if(!a[c[k]][c[i]]&&!a[c[j]][c[k]]&&d[i][j]>d[i][k]+d[k][j])
d[i][j]=d[i][k]+d[k][j];
memset(vis,false,sizeof vis);
ans=0x3f3f3f3f;
vis[c[S]]=true;
dfs(S,);
if(ans==0x3f3f3f3f)printf("-1\n");
else printf("%d\n",ans);
return ;
}

TZOJ 4871 文化之旅(floyd预处理+dfs剪枝)的更多相关文章

  1. NOIP2012pj文化之旅[floyd]

    描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次,即如果他学习了某种文化,则他就不能到达其他有这种文化的国家.不同的国家可能有相同的文化.不同文化的国家 ...

  2. 【Floyd】文化之旅

    [NOIP2012]文化之旅 题目描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一 种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不 ...

  3. 洛谷 P1078 文化之旅

    P1078 文化之旅 题目描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不同的国家可能 ...

  4. 洛谷P1078 文化之旅

    P1078 文化之旅 1.1K通过 3.6K提交 题目提供者洛谷OnlineJudge 标签NOIp普及组2012 难度普及+/提高 时空限制1s / 128MB 提交  讨论  题解 最新讨论更多讨 ...

  5. code1316 文化之旅

    文化之旅的本质是最短路问题,只不过添加了一个文化排斥,仅需要做最短路时判断一下是否排斥即可 因为数据较小,采用了Floyd算法,以下是代码,关键部分附注释: #include<iostream& ...

  6. AC日记——文化之旅 洛谷 P1078

    文化之旅 思路: 暴搜,倒搜: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 105 #define max ...

  7. [最短路]P1078 文化之旅

    题目描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一 种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不 同的国家可能有相同的文化.不同 ...

  8. 洛谷 P1078 文化之旅 解题报告

    P1078 文化之旅 题目描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不同的国家可能 ...

  9. java算法 蓝桥杯 文化之旅

    问题描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不同的国家可能有相同的文化.不同文化 ...

随机推荐

  1. J2SE 8的流库 --- 转换流, 得到的还是流

    流的转换, 按照条件过滤/映射/摊平/截取/丢弃/连接/去重/排序. 辅助方法 public static int myCompare(String x, String y) { if(x.lengt ...

  2. android的特点有哪些

    android拥有完善的应用程序框架,支持4大应用组件activity,service,contentProvider,broadcast,可以在任意层次上进行复用和更换: android中java字 ...

  3. Others-大数据平台Lambda架构浅析(全量计算+增量计算)

    大数据平台Lambda架构浅析(全量计算+增量计算) 2016年12月23日 22:50:53 scuter_victor 阅读数:1642 标签: spark大数据lambda 更多 个人分类: 造 ...

  4. Xcode 8 注释快捷键失效

    sudo /usr/libexec/xpccachectl 重启

  5. php 分页实现 和 php 大文件上传失败的处理方式

    1. php分页: 要想做php的分页,首先要弄清楚要什么样的分页,关系到哪些参数,参数之间怎么关联: 目标分页效果如下: 分析: 1.主要涉及两个参数:一个是当前输出页面的页码,用变量$p 表示,另 ...

  6. Ftp命令使用

    FTP> ? 显示 ftp 命令说明.? 与 help 相同. 格式:?  [command] 说明:[command] 指定需要帮助的命令名称.如果没有指定 command,ftp将显示全部命 ...

  7. 支持向量机通俗导论(理解SVM的三层境界)(ZT)

    支持向量机通俗导论(理解SVM的三层境界) 原文:http://blog.csdn.net/v_JULY_v/article/details/7624837 作者:July .致谢:pluskid.白 ...

  8. Ajax 学习 第三篇

    1.什么是json 第一种方法 第二种方法 比较evar and jsondata 任何时候使用EVAR要特别小心,他不会管输入对象的类型 JSONLint可以在线校验代码的正确性 改写代码

  9. ubuntu18.04获取root权限并用root用户登录

    1.为root设置初始密码 (1)登录系统,打开终端,输入命令:sudo passwd root(使用root权限为root更改密码) (2)设置root密码(建议简单点,没必要那么复杂): (3)重 ...

  10. webuploader.js

    PHP  多图上传,图片批量上传插件,webuploader.js,百度文件上传插件(案例教程) WebUploader作用: 使用WebUploader还可以批量上传文件.支持缩略图等等众多参数选项 ...