题目描述 Description

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

输入 Input

第一行为五个整数 N , K , M , S , T N,K,M,S,T N,K,M,S,T,每两个整数之间用一个空格隔开,依次代表国家个数(国家编号为 1 1 1 到 N N N),文化种数(文化编号为 1 1 1 到 K K K),道路的条数,以及起点和终点的编号(保证 S S S 不等于 T T T);
第二行为 N N N个整数,每两个整数之间用一个空格隔开,其中第$ i$ 个数 C i C_i Ci​,表示国家i的文化为 C i C_i Ci​。
接下来的 K K K 行,每行 K K K 个整数,每两个整数之间用一个空格隔开,记第 i i i 行的第$ j$ 个数为 a i j a_{ij} aij​, a i j = 1 a_{ij}= 1 aij​=1 表示文化 i i i 排斥外来文化$ j ( ( (i$ 等于$ j$ 时表示排斥相同文化的外来人), a i j = 0 a_{ij}= 0 aij​=0 表示不排斥(注意 $i 排 斥 排斥 排斥 j$ 并不保证 j j j 一定也排斥$ i$)。
接下来的 M M M 行,每行三个整数 u , v , d u,v,d u,v,d,每两个整数之间用一个空格隔开,表示国家 u u u与国家 v v v有一条距离为 d d d的可双向通行的道路(保证 u u u 不等于$ v$,两个国家之间可能有多条道路)。

输出 Output

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

样例输入#1 Sample Input#1

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

样例输出#1 Sample Output#1

-1

样例输入#2 Sample Input#2

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

样例输出#2 Sample Output#2

10

Limits 限制

对于 20 % 20\% 20%的数据 有 2 ≤ N ≤ 8 , K ≤ 5 2≤N≤8,K≤5 2≤N≤8,K≤5
对于 30 % 30\% 30%的数据 有 2 ≤ N ≤ 10 , K ≤ 5 2≤N≤10,K≤5 2≤N≤10,K≤5
对于 50 % 50\% 50%的数据 有 2 ≤ N ≤ 20 , K ≤ 8 2≤N≤20,K≤8 2≤N≤20,K≤8
对于 70 % 70\% 70%的数据 有 2 ≤ N ≤ 100 , K ≤ 10 2≤N≤100,K≤10 2≤N≤100,K≤10
对于 100 % 100\% 100%的数据 有 2 ≤ N ≤ 100 , 1 ≤ K ≤ 100 , 1 ≤ M ≤ N 2 , 1 ≤ C i ≤ K , 1 ≤ u , v ≤ N , 1 ≤ d ≤ 1000 , S ≠ T , 1 ≤ S , T ≤ N 。 2≤N≤100,1≤K≤100,1≤M≤N^2,1≤C_i≤K,1≤u,v≤N,1≤d≤1000,S≠T,1≤S,T≤N。 2≤N≤100,1≤K≤100,1≤M≤N2,1≤Ci​≤K,1≤u,v≤N,1≤d≤1000,S​=T,1≤S,T≤N。
Time Limit : 1 s 1s 1s & Memory Limit : 128 M B 128MB 128MB

(当年普及组考SPFA+最短路乱搞也是醉了…)
最短路没的说,SPFA先打上,关键是还得搞一个东西维护题里条件,于是就有了(瞎搞)的基础
直接看代码吧…(数组名很人性化)
(其实好几处还能优化…不过VJ已经 0 m s 0ms 0ms了就不改了)

#include <cstdio>
#include <cstring>
#include <climits>
#define MAXN 110int n,m,k,s,t,x,u,v,w;
int culture[MAXN];
int against_num[MAXN];
int against[MAXN][MAXN];
int road[MAXN][MAXN],road_dis[MAXN][MAXN];
int road_num[MAXN];
int dis[MAXN];
int q[MAXN];//手写队列,其实可以用STL
bool inq[MAXN],can_arrive[MAXN],arrive[MAXN][MAXN];
//can_arrive:can_arrive[i]=true表明在走的路径上可以经过i(合法路一定满足路上的文化没有与t国文化对立的)
//arrive:第一维是国家,第二维是文化,表明到达i国家学习到j文化的状态
bool check(int a,int b)
{for (int i=1;i<=against_num[culture[b]];i++)if (arrive[a][against[culture[b]][i]])return false;if (culture[a]==culture[b]) return false; //判断是否满足不重复学习同种文化(貌似不加也能过?)else return true;
}int spfa()
{int head=0,tail=1;for (int i=1;i<=n;i++) dis[i]=INT_MAX;q[tail]=s;arrive[s][culture[s]]=true;inq[s]=true;dis[s]=0;while (head!=tail){head=(head%n)+1;inq[q[head]]=false;for (int i=1;i<=road_num[q[head]];i++){if(check(q[head],road[q[head]][i])) //判断要到达的国家和已到达的国家文化是否冲突和是否学习相同文化{if (can_arrive[culture[road[q[head]][i]]]){if (dis[q[head]]+road_dis[q[head]][i]<dis[road[q[head]][i]]) //正常SPFA{dis[road[q[head]][i]]=dis[q[head]]+road_dis[q[head]][i];for (int j=1;j<=k;j++) //继承状态arrive[road[q[head]][i]][j]=arrive[q[head]][j];arrive[road[q[head]][i]][culture[road[q[head]][i]]]=true;if (!inq[road[q[head]][i]]){inq[road[q[head]][i]]=true;tail=(tail%n)+1;q[tail]=road[q[head]][i];}}}}}}if (dis[t]==INT_MAX) return -1;else return dis[t];
}int main()
{scanf("%d %d %d %d %d",&n,&k,&m,&s,&t);for (int i=1;i<=n;i++)scanf("%d",&culture[i]);for (int i=1;i<=k;i++)for (int j=1;j<=k;j++){scanf("%d",&x);if (x==1){against_num[i]++;against[i][against_num[i]]=j;}}for (int i=1;i<=m;i++){scanf("%d %d %d",&u,&v,&w);road_num[u]+=1;road[u][road_num[u]]=v;road_dis[u][road_num[u]]=w;road_num[v]+=1;road[v][road_num[v]]=u;road_dis[v][road_num[v]]=w;}memset(can_arrive,true,sizeof(can_arrive));memset(inq,false,sizeof(inq));memset(arrive,false,sizeof(arrive));for (int i=1;i<=against_num[culture[t]];i++)can_arrive[against[culture[t]][i]]=false;printf("%d\n",spfa());return 0;
}

话说当年出这么难题配了个巨水的数据…

[NOIP] [最短路] NOIP2012Junior 文化之旅 (culture)相关推荐

  1. 【原创】【NOIP】文化之旅

    文化之旅(culture.cpp) 时间限制: 1 Sec   内存限制: 128 MB 提交: 86   解决: 1 [ →][ ~\(≧▽≦)/~单击此处查看最不建议你看的博客~\(≧▽≦)/~] ...

  2. 文化之旅(dijstra)

    2012_p4 文化之旅 (culture.cpp/c/pas) 时间限制: 1 Sec  内存限制: 128 MB 提交: 43  解决: 16 [提交][状态][讨论版][命题人:外部导入] 题目 ...

  3. NOIP 2012 普及组 复赛 culture 文化之旅

    NOIP 2012 普及组 复赛 culture 文化之旅 1.找寻迪杰斯特拉(Dijkstra)算法,难度适中,过程中,找到该题. 2.结合题意,弄懂输入输出样例是关键一步. 3.为了能解决2,纸笔 ...

  4. [普及] NOIP 2012 文化之旅

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

  5. 1316 文化之旅 2012年NOIP全国联赛普及组

    1316 文化之旅 2012年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 有一位使者要游历各国,他每到一 ...

  6. NOIP2012 普及组 T4 文化之旅

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

  7. 【codevs1316NOIP2012PJ】文化之旅,无题

    文化之旅 2012年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 有一位使者要游历各国,他每到一个国 ...

  8. noip2012 文化之旅 (深搜,最优性剪枝)

    P2070 [NOIP2012P4]文化之旅 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 NOIP 2012 普及组 题4 描述 有一位使者要游历各国,他 ...

  9. Java实现 蓝桥杯VIP 算法提高 文化之旅

    算法提高 文化之旅 时间限制:1.0s 内存限制:128.0MB 问题描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次(即如果他学习了某种文化,则他就不 ...

最新文章

  1. 3行代码就能可视化Transformer的奥义 | 开源
  2. 10万元奖金语音识别赛进行中!CTC 模型 Baseline 助你轻松上分
  3. Java的设计模式----strategy(策略模式)
  4. ruby,rails环境架设配置 转载一文章.
  5. matlab复数方程的根,matlab解一元三次方程,得到的都是复数根。
  6. 组队瓜分百万奖金池,资深算法工程师带你挑战飞桨论文复现赛!
  7. qweb加html文件,将本地html文件加载到Pyside QwebVi中
  8. guava cache reload返回新旧值解析
  9. 浅析:18个影响网站流量下降的原因!
  10. 浅析pc机上如何将vmlinuz-2.6.31-14-generic解压出vmlinux
  11. 拓端tecdat|R语言对混合分布中的不可观测与可观测异质性因子分析
  12. java后端开发题库_2020年Java题库整理
  13. 5G关键技术与系统演进pdf
  14. luoguP4173 残缺的字符串 FFT
  15. 那些变态的javascript输出
  16. 使el-input失焦
  17. SVM分类器中损失函数梯度求法及理解
  18. Terraform学习2
  19. html时间戳转日期
  20. Python数据分析——数据基础

热门文章

  1. 分析Perm()函数功能、代码、时间复杂度
  2. 怎么使用PS一键抠图?
  3. Ubuntu16.04下caffe CPU版的详细安装步骤
  4. Wox Github下载太慢了
  5. 华大单片机HC32L130 / HC32L136 / HC32F030 系列硬件开发指南
  6. 流放之路+连接服务器+未响应,流放之路链接服务器中就未响应
  7. 电脑外设(I/O)简介:键盘鼠标
  8. proxy_redirect
  9. MySQL 数据库管理之 --- 日志查询
  10. Linux内核版本号的含义