描述

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

输入

第一行为五个整数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. SVM视频跟踪

    # -*- coding: utf-8 -*- """ Created on Thu Nov 8 21:44:12 2018 @author: xg "&quo ...

  2. day02-数据库操作

    一.数据库操作 1.1.创建数据库(增) CREATE DATABASE 也可以使用小写,(注意不要漏掉分号 ;) mysql> create database test; 或 mysql> ...

  3. byobu copy

    Copy and Paste in Scrollback mode (screen/byobu) Enter scrollback mode: F7 Move the cursor to the st ...

  4. Service的启动,绑定,绑定后通信,跨应用绑定,跨应用绑定后通信

    Service介绍: 与Acitivity平级的Android四大组件之一,对比Activity而言,就是没有交互界面,且可以一直在后台执行,只用于处理下载,I/O等长时间信息交流的任务. Servi ...

  5. 使用DDOS deflate抵御少量DDOS攻击

    DDoS-Deflate是一款非常小巧的防御和减轻DDoS攻击的工具,它可以通过监测netstat来跟踪来创建大量互联网连接的IP地址信息,通过APF或IPTABLES禁止或阻档这些非常IP地址. 工 ...

  6. centOS6.6网络设置

    linux的网卡IP地址是存放在文件中的,这个配置文件在/etc/sysconfig/network-scripts下, 名称分别为ifcfg-eth0,ifcfg-eth1等 如果你只有一块网卡,就 ...

  7. IP/IGMP/UDP校验和算法

    校验和算法:IP.IGMP.UDP和TCP报文头部都有检验和字段,其算法都是一样的. IP.IGMP.UDP和TCP校验和的范围:仅报文头部长度. 在发送数据时,为了计算数据包的检验和.应该按如下步骤 ...

  8. Linux 创建用户 限制SFTP用户只能访问某个目录

    Linux 限制SFTP用户只能访问某个目录 1. 新建用户并设置密码 > useradd suser > passwd suser   // 输入密码 2. 设置sshd配置文件 > ...

  9. max_element(C++)求数组最大元素

    #include<iostream> #include<vector> #include<algorithm> using namespace std; int m ...

  10. 1.3.6、CDH 搭建Hadoop在安装之前(端口---DistCp使用的端口)

    DistCp使用的端口 列出的所有端口都是TCP. 在下表中,每个端口的“ 访问要求”列通常是“内部”或“外部”.在此上下文中,“内部”表示端口仅用于组件之间的通信; “外部”表示该端口可用于内部或外 ...