TZOJ 4871 文化之旅(floyd预处理+dfs剪枝)
描述
有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次,即如果他学习了某种文化,则他就不能到达其他有这种文化的国家。不同的国家可能有相同的文化。不同文化的国家对其他文化的看法不同,有些文化会排斥外来文化,即如果他学习了某种文化,则他不能到达排斥这种文化的其他国家。 现给定各个国家间的地理关系,各个国家的文化,每种文化对其他文化的看法,以及这位使者游历的起点和终点(在起点和终点也会学习当地的文化),国家间的道路距离,试求从起点到终点最少需走多少路。
输入
第一行为五个整数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剪枝)的更多相关文章
- NOIP2012pj文化之旅[floyd]
描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次,即如果他学习了某种文化,则他就不能到达其他有这种文化的国家.不同的国家可能有相同的文化.不同文化的国家 ...
- 【Floyd】文化之旅
[NOIP2012]文化之旅 题目描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一 种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不 ...
- 洛谷 P1078 文化之旅
P1078 文化之旅 题目描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不同的国家可能 ...
- 洛谷P1078 文化之旅
P1078 文化之旅 1.1K通过 3.6K提交 题目提供者洛谷OnlineJudge 标签NOIp普及组2012 难度普及+/提高 时空限制1s / 128MB 提交 讨论 题解 最新讨论更多讨 ...
- code1316 文化之旅
文化之旅的本质是最短路问题,只不过添加了一个文化排斥,仅需要做最短路时判断一下是否排斥即可 因为数据较小,采用了Floyd算法,以下是代码,关键部分附注释: #include<iostream& ...
- AC日记——文化之旅 洛谷 P1078
文化之旅 思路: 暴搜,倒搜: 代码: #include <bits/stdc++.h> using namespace std; #define maxn 105 #define max ...
- [最短路]P1078 文化之旅
题目描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一 种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不 同的国家可能有相同的文化.不同 ...
- 洛谷 P1078 文化之旅 解题报告
P1078 文化之旅 题目描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不同的国家可能 ...
- java算法 蓝桥杯 文化之旅
问题描述 有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家).不同的国家可能有相同的文化.不同文化 ...
随机推荐
- SVM视频跟踪
# -*- coding: utf-8 -*- """ Created on Thu Nov 8 21:44:12 2018 @author: xg "&quo ...
- day02-数据库操作
一.数据库操作 1.1.创建数据库(增) CREATE DATABASE 也可以使用小写,(注意不要漏掉分号 ;) mysql> create database test; 或 mysql> ...
- byobu copy
Copy and Paste in Scrollback mode (screen/byobu) Enter scrollback mode: F7 Move the cursor to the st ...
- Service的启动,绑定,绑定后通信,跨应用绑定,跨应用绑定后通信
Service介绍: 与Acitivity平级的Android四大组件之一,对比Activity而言,就是没有交互界面,且可以一直在后台执行,只用于处理下载,I/O等长时间信息交流的任务. Servi ...
- 使用DDOS deflate抵御少量DDOS攻击
DDoS-Deflate是一款非常小巧的防御和减轻DDoS攻击的工具,它可以通过监测netstat来跟踪来创建大量互联网连接的IP地址信息,通过APF或IPTABLES禁止或阻档这些非常IP地址. 工 ...
- centOS6.6网络设置
linux的网卡IP地址是存放在文件中的,这个配置文件在/etc/sysconfig/network-scripts下, 名称分别为ifcfg-eth0,ifcfg-eth1等 如果你只有一块网卡,就 ...
- IP/IGMP/UDP校验和算法
校验和算法:IP.IGMP.UDP和TCP报文头部都有检验和字段,其算法都是一样的. IP.IGMP.UDP和TCP校验和的范围:仅报文头部长度. 在发送数据时,为了计算数据包的检验和.应该按如下步骤 ...
- Linux 创建用户 限制SFTP用户只能访问某个目录
Linux 限制SFTP用户只能访问某个目录 1. 新建用户并设置密码 > useradd suser > passwd suser // 输入密码 2. 设置sshd配置文件 > ...
- max_element(C++)求数组最大元素
#include<iostream> #include<vector> #include<algorithm> using namespace std; int m ...
- 1.3.6、CDH 搭建Hadoop在安装之前(端口---DistCp使用的端口)
DistCp使用的端口 列出的所有端口都是TCP. 在下表中,每个端口的“ 访问要求”列通常是“内部”或“外部”.在此上下文中,“内部”表示端口仅用于组件之间的通信; “外部”表示该端口可用于内部或外 ...