算法提高 文化之旅

时间限制:1.0s 内存限制:128.0MB

问题描述

  有一位使者要游历各国,他每到一个国家,都能学到一种文化,但他不愿意学习任何一种文化超过一次(即如果他学习了某种文化,则他就不能到达其他有这种文化的国家)。不同的国家可能有相同的文化。不同文化的国家对其他文化的看法不同,有些文化会排斥外来文化(即如果他学习了某种文化,则他不能到达排斥这种文化的其他国家)。

  现给定各个国家间的地理关系,各个国家的文化,每种文化对其他文化的看法,以及这位使者游历的起点和终点(在起点和终点也会学习当地的文化),国家间的道路距离,试求从起点到终点最少需走多少路。

输入格式

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

输出格式

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

样例输入

2 2 1 1 2

1 2

0 1

1 0

1 2 10

样例输出

-1

输入输出样例说明

  由于到国家2必须要经过国家1,而国家2的文明却排斥国家1的文明,所以不可能到达国家2。

样例输入

2 2 1 1 2

1 2

0 1

0 0

1 2 10

样例输出

10

输入输出样例说明

  路线为1 -> 2。

数据规模和约定

  对于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。

import java.util.ArrayList;
import java.util.Scanner; public class 文化之旅 {
static int[] bian; //遍历标准
static ArrayList<Integer> list = new ArrayList<Integer>();
static int[] hua;
static int[][] wen;
static int[][] lu;
static int N, K, M, S, T;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N = sc.nextInt(); //国家个数 从1开始
K = sc.nextInt(); //文化个数从1开始
M = sc.nextInt(); //道路条数
S = sc.nextInt(); //起点国家
S = S - 1;
T = sc.nextInt(); //终点国家
T = T - 1;
bian = new int[N];
hua = new int[N]; //国家的文化
wen = new int[K][K]; //文化的排斥
lu = new int[N][N]; //国家之间的路
for(int i=0;i<N;i++){
int tmp = sc.nextInt();
hua[i] = tmp -1;
}
for(int i=0;i<K;i++)
for(int j=0;j<K;j++)
wen[i][j] = sc.nextInt();
for(int i=0;i<M;i++){
int a,b,c;
a = sc.nextInt();
b = sc.nextInt();
c = sc.nextInt();
if(lu[a-1][b-1]==0)
lu[a-1][b-1] = c;
else if(lu[a-1][b-1]>c)
lu[a-1][b-1] = c;
if(lu[b-1][a-1]==0)
lu[b-1][a-1] = c;
else if(lu[b-1][a-1]>c)
lu[b-1][a-1] = c;
}
int[] cost = new int[N];
int[] select = new int[N];
int shei = S;
int shzh = 0;
select[shei] = 1;
for(int j=0;j<N;j++)
cost[j] = -1;
for(int i=0;i<N;i++){
for(int j=0;j<N;j++){
if(lu[shei][j]!=0&&wen[hua[j]][hua[shei]]!=1&&select[j]==0){
cost[j] = shzh + lu[shei][j];
}
}
int min = -1;
for(int j=0;j<N;j++){
if(cost[j]!=-1&&select[j]==0)
if(min ==-1){
min = j;
}else{
if(cost[j]<cost[min])
min = j;
}
}
if(min == -1) break;
else{
select[min] = 1;
shei = min;
}
shzh = cost[shei];
}
if(cost[T] == -1){
System.out.println(-1);
}else{
System.out.println(cost[T]);
} } }

Java实现 蓝桥杯VIP 算法提高 文化之旅的更多相关文章

  1. Java实现 蓝桥杯VIP 算法提高 研究兔子的土豪

    试题 算法提高 研究兔子的土豪 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 某天,HWD老师开始研究兔子,因为他是个土豪 ,所以他居然一下子买了一个可以容纳10^18代兔子的巨大 ...

  2. Java实现 蓝桥杯VIP 算法提高 3-2求存款

    算法提高 3-2求存款 时间限制:1.0s 内存限制:256.0MB 问题描述 见计算机程序设计基础(乔林)P50第5题. 接受两个数,一个是用户一年期定期存款金额,一个是按照百分比格式表示的利率,计 ...

  3. Java实现 蓝桥杯VIP 算法提高 3-3求圆面积表面积体积

    算法提高 3-3求圆面积表面积体积 时间限制:1.0s 内存限制:256.0MB 问题描述 接受用户输⼊的数值,输出以该值为半径的(1)圆面积,(2)球体表面积,(3)球体体积.pi 取值3.1415 ...

  4. Java实现 蓝桥杯VIP 算法提高 5-3日历

    算法提高 5-3日历 时间限制:1.0s 内存限制:256.0MB 问题描述 已知2007年1月1日为星期一.设计一函数按照下述格式打印2007年以后(含)某年某月的日历,2007年以前的拒绝打印.为 ...

  5. Java实现 蓝桥杯VIP 算法提高 11-2删除重复元素

    算法提高 11-2删除重复元素 时间限制:10.0s 内存限制:256.0MB 问题描述 为库设计新函数DelPack,删除输入字符串中所有的重复元素.不连续的重复元素也要删除. 要求写成函数,函数内 ...

  6. Java实现 蓝桥杯VIP 算法提高 P0401

    算法提高 P0401 时间限制:1.0s 内存限制:256.0MB 输入一个无符号整数x,输出x的二进制表示中1的个数. 输入: 76584 输出: 7 import java.util.Scanne ...

  7. Java实现 蓝桥杯VIP 算法提高 理财计划

    算法提高 理财计划 时间限制:1.0s 内存限制:256.0MB 问题描述 银行近期推出了一款新的理财计划"重复计息储蓄".储户只需在每个月月初存入固定金额的现金,银行就会在每个月 ...

  8. Java实现 蓝桥杯VIP 算法提高 解二元一次方程组

    算法提高 解二元一次方程组 时间限制:1.0s 内存限制:256.0MB 问题描述 给定一个二元一次方程组,形如: a * x + b * y = c; d * x + e * y = f; x,y代 ...

  9. Java实现 蓝桥杯VIP 算法提高 陶陶摘苹果2

    算法提高 陶陶摘苹果2 时间限制:1.0s 内存限制:256.0MB 问题描述 陶陶家的院子里有一棵苹果树,每到秋天树上就会结出n个苹果.苹果成熟的时候,陶陶就会跑去摘苹果.陶陶有个30厘米高的板凳, ...

随机推荐

  1. Altium Designer PCB封装bug,元件焊盘位置偏移解决方法

    1.问题描述:在拖动几个电阻位置时,意外发现Altium designer20版本软件的一个bug——0805的电阻两焊盘位置发生了偏移,如下图所示. 2.解决办法: ①选中焊盘偏移的封装,右键剪切掉 ...

  2. [hdu3644 A Chocolate Manufacturer's Problem]模拟退火,简单多边形内最大圆

    题意:判断简单多边形内是否可以放一个半径为R的圆 思路:如果这个多边形是正多边形,令r(x,y)为圆心在(x,y)处多边形内最大圆的半径,不难发现,f(x,y)越靠近正多边形的中心,r越大,所以可以利 ...

  3. Python --元组与列表的差异

    · Python中的元组与列表类似,不同之处是元组的元素不能修改 · 元组使用小括号,不使用括号也可以,列表使用方括号 for example:

  4. java ->IO流_序列化流与反序列化流

    序列化流与反序列化流 用于从流中读取对象的操作流 ObjectInputStream    称为 反序列化流 用于向流中写入对象的操作流 ObjectOutputStream   称为 序列化流(对象 ...

  5. assign 与 深浅拷贝

    Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象.它将返回目标对象. 如果目标对象中的属性具有相同的键,则属性将被源对象中的属性覆盖.后面的源对象的属性将类 ...

  6. Python-AES加密算法接口测试

    前言 先前已经学过了Python-SHA256加密算法接口测试,今天我跟大家讲解一下AES加密算法的接口如何写python脚本进行测试. 一:安装pycryptodome模块 pip install ...

  7. County Fair Events

    先按照结束时间进行排序,取第一个节日的结束时间作为当前时间,然后从第二个节日开始搜索,如果下一个节日的开始时间大于当前的时间,那么就参加这个节日,并更新当前时间 #include <bits/s ...

  8. MySQL的列约束

    1.列约束 (1)主键约束——PRIMARY KEY (2)非空约束——NOT NULL 声明了非空约束的列上,不允许使用NULL (3)唯一约束——UNIQUE 声明了唯一约束的列上不能插入重复的值 ...

  9. linux常用命令---文件拷贝与传输

    拷贝命令 文件传输

  10. Django之ORM对象关系模型

    MVC或者MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库,这极大的减轻了开发人员的工作量,不需 ...