华为机试---旅途

题目描述

原来是要到醋溜站台乘坐醋溜快车到醋溜港”,亮亮解出了地图隐藏的秘密,赶紧奔向醋溜站台,但到了之后,亮亮忧桑地发现,从醋溜站台到醋溜港沿途的每个车站都有很多美女被他飒爽的英姿所吸引,只要经过车站就会被这些漂亮的女孩搭讪,但是现在亮亮一心想要寻找楚楚街而没空去搭理她们,所以亮亮希望在抵达醋溜港的时候被搭讪的次数最少。问亮亮抵达醋溜港最少会被搭讪多少次?

输入描述:
第一行包含两个整数N(2<=N<=5000),M(1<=M<=50000)。N表示公有N个汽车站,M表示公有M条公路,起点为1,终点为N。
第二行包含N个整数(0<=K<=10000),第i个整数表示在第i站有K个美女想要搭讪亮亮。
接下来M行,每行包含两个整数P(1<=P<=N),Q(1<=Q<=N),代表P,Q两个站是有班车直达的。


输出描述:
一个整数,即亮亮抵达醋溜港最少需要被搭讪的次数。

输入例子:
5 5
0 1 1 3 6
1 2
1 4
2 3
3 5
4 5

输出例子:

8

import java.util.Scanner; 


public class Main {
private static final int MAX = 1000000;//表示两个站点之间不可达
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
while(scan.hasNext()){
int N = scan.nextInt();//共有N个汽车站
int M = scan.nextInt();//共有M条公路,起点1,终点N
int[] disturb = new int[N];//第i站有k个美女要搭讪
for(int i = 0 ; i < N ; i++){
disturb[i] = scan.nextInt();
}
//两汽车站之间是否有班车直达
            int[][] road = new int[N][N];
            //初始情况下默认两个站点不可达
            for(int i = 0 ; i < N ; i++){
            for(int j = 0 ; j < N ; j++){
            road[i][j] = MAX;
            }
            }
            //使用搭讪次数作为路径权值,根据公路情况更新road
            for(int i = 0 ; i < M ; i++){
            int start = scan.nextInt();
            int end = scan.nextInt();
            road[start - 1][end - 1] = disturb[end - 1];
            road[end - 1][start - 1] = disturb[start - 1];
            }
            searchMinDisturb(N , M , disturb , road);
}
scan.close();
    }
/**
* 计算路途中的最少搭讪次数
* @param N 汽车站个数
* @param M 公路条数
* @param disturb 每个站点被搭讪的次数
* @param road 记录某两个站点是否可达
* */
private static void searchMinDisturb(int N , int M , int[] disturb , int[][] road){
int[] shortDisturb = new int[N];//保存经过车站的最少打扰次数1~N
for(int i = 0 ; i < N ; i++){
shortDisturb[i] = MAX;
}
int[] visit = new int[N];//汽车站的访问标记
//初始化,从汽车站1开始旅程
shortDisturb[0] = disturb[0];
visit[0] = 1;
int startStation = 0;//起始位置在1号汽车站
//还要经过n-1个站点
for(int count = 0 ; count < N - 1 ; count++){
//开始的时候不知道下一个站点,赋初值为-1
int nextMinIndex = -1;
//贪心算法容易陷入局部最优,使用Dijsktra算法求最短路径
            int minDisturb = Integer.MAX_VALUE;//如果有几个站点都满足题意,保存最小值
for(int i = 0 ; i < N ; i++){                
//寻找下一个要前往的站点,保证有公路并且美女的搭讪次数最少
if(visit[i] == 0 && road[startStation][i] < minDisturb){                    
nextMinIndex = i;
                      minDisturb = road[startStation][i];                    
}               
}
            shortDisturb[nextMinIndex] = minDisturb;  
            visit[nextMinIndex] = 1;
//判断下一个站点是不是终点N,如果是提前结束,如果不是继续下一次寻找
if(nextMinIndex == N - 1){
                break;
            }           
            //更新权值矩阵
            for(int i = 0 ; i < N ; i++){
            if(visit[i] == 0 && road[startStation][nextMinIndex] + road[nextMinIndex][i] < road[startStation][i]){
            road[startStation][i] = road[startStation][nextMinIndex] + road[nextMinIndex][i];
            }
            }
}
        //最少搭讪次数 = 途中遇到的搭讪次数 + 起始站1遇到的搭讪次数
System.out.println(shortDisturb[N - 1] + shortDisturb[0]);
}
}

108题中有部分题目重合,因此么有收录在压缩文件中。 华为 ├─001 字符串最后一个单词长度 │ └─Source ├─002 计算字符个数 │ └─Source ├─003 明明的随数 │ └─Source ├─004 字符串分隔 │ └─Source ├─005 进制转换 │ └─Source ├─006 质数因子 │ └─Source ├─007 取近似值 │ └─Source ├─008 合并表记录 │ └─Source ├─009 提取不重复的整数 │ └─Source ├─010 字符个数统计 │ └─Source ├─011 数字颠倒 │ └─Source ├─012 字符串反转 │ └─Source ├─013 句子逆序 │ └─Source ├─014 字典序排序 │ └─Source ├─015 求int型正整数在内存中存储是1的个数 │ └─Source ├─016 购物单 │ ├─Debug │ ├─Source │ │ └─Debug │ ├─Source - 时间优先 │ │ └─Debug │ └─Source - 空间优先 │ ├─Debug │ └─Release ├─017 坐标移动 ├─018 识别IP地址分类统计 │ └─Source │ └─Debug ├─019 错误记录 ├─020 密码验证合格程序 ├─021 密码破解 ├─023 删除字符串中出现次数最少字符 │ └─Source │ └─Debug ├─024 合唱队 │ └─Source │ ├─Debug │ └─Release ├─025 数据分类处理 │ └─Source │ └─Debug ├─026 查找兄弟单词 │ └─Source │ └─Debug ├─027 素数伴侣 │ └─Source │ └─Debug ├─028 字符串合并处理 │ └─Source │ └─Debug ├─030 密码截取(查找最长回文字符串) ├─031 蛇形矩阵 │ └─Source │ └─Debug ├─033 判断IP是否属于同一子网 │ └─Source │ └─Debug ├─034 称砝码 │ └─Source │ └─Debug ├─035 学英语 │ └─Source │ └─Debug ├─036 迷宫问题 │ └─Source │ └─Debug ├─037 数独问题 │ └─Debug ├─038 名字漂亮度 │ └─Source │ └─Debug ├─039 字符串截取 │ └─Source │ └─Debug ├─040 单链表删除数据 │ └─Source │ └─Debug ├─041 多线程 │ └─Source │ ├─Backup │ ├─Debug │ │ └─041.tlog │ └─Release │ └─041.tlog ├─042 表达式计算 │ └─Source │ └─Debug ├─043 计算字符串距离 │ └─Source │ └─Debug ├─044 杨辉三角形变形 ├─046 挑7 ├─047 完全数 │ └─Debug ├─048 高精度加法 ├─049 输出n个数中最小的k个 │ └─Debug ├─050 找出字符串只出现一次的字符 │ └─Debug ├─051 组成一个偶数最接近的2个质数 │ └─Debug ├─052 M个苹果放入N个盘子 ├─053 查找整数二进制中1的个数 ├─054 DNA子串 ├─055 MP3光标位置 │ └─Source │ └─Debug ├─056 查找2个字符串最大相同子串 │ └─Debug ├─057 配置文件恢复 │ └─Source │ └─Debug ├─058 24点计算 │ └─Debug ├─059 成绩排序 ├─060 矩阵相乘 ├─061 矩阵乘法次数计算 ├─062 字符串通配符 │ └─Debug ├─066 命令行解析 │ └─Source │ └─Debug ├─067 最大相同子串长度 │ └─Debug ├─068 火车编号进站 │ └─Debug ├─072 数组合并 ├─074 埃及分数 │ └─Source │ └─Debug ├─076 密码截取 │ └─Source ├─077 求最大连续bit数 ├─078 密码强度 ├─079 扑克牌大小 │ └─Source │ └─Debug ├─081 合法IP ├─082 棋盘格子走法 ├─083 在字符串中找出连续最长数字串 ├─084 int数组分组,两组和相等 │ └─Source │ └─Debug ├─086 人民币转换 │ └─Source │ └─Debug ├─087 表示数字 ├─090 自动售货系统 │ └─Source │ └─Debug └─091 24点输出 └─Debug
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值