单源最短路的建图方式

1129. 热浪 - AcWing题库

这道题可以有三种方法来做,朴素版的dijkstra、堆优化版的dijkstra和spfa算法

(1)spfa算法 

 这里的队列用循环队列,而不是像模板那样用普通队列是因为它的队列长度不确定

import java.util.*;public class Main{static int N = 2510, M = 2 * 6200 + 10;static int n, m, S, T, idx;static int[] dist = new int[N];static int[] q = new int[N];static int[] h = new int[N], ne = new int[M], e = new int[M], w = new int[M];//邻接表static boolean[] st = new boolean[N];//邻接表存储public static void add(int a, int b, int c){e[idx] = b;w[idx] = c;ne[idx] = h[a];h[a] = idx ++;}public static void spfa(){Arrays.fill(dist, 0x3f3f3f3f);dist[S] = 0;int hh = 0, tt = 1;//循环队列q[0] = S;st[S] = true;//在队列里面while(hh != tt){//循环队列判断为空的条件int t = q[hh ++];if(hh == N) hh = 0;st[t] = false;//取出了这个元素for(int i = h[t]; i != -1; i = ne[i]){int j = e[i];if(dist[j] > dist[t] + w[i]){dist[j] = dist[t] + w[i];if(!st[j]){q[tt ++] = j;//加入循环队列if(tt == N) tt = 0;st[j] = true;}}}}}public static void main(String[] args){Scanner sc = new Scanner(System.in);n = sc.nextInt();//点m = sc.nextInt();//边S = sc.nextInt();//起点T = sc.nextInt();//终点//建图Arrays.fill(h, -1);//这个一定要记得for(int i = 0; i < m; i ++){int a = sc.nextInt();int b = sc.nextInt();int c = sc.nextInt();add(a, b, c);//无向图add(b, a, c);}spfa();System.out.print(dist[T]);}
}

(2) dijkstra堆优化算法

import java.util.*;class PII implements Comparable<PII>{int distance, num;public PII(int distance, int num){this.distance = distance;this.num = num;}public int compareTo(PII o){return distance - o.distance;}
}public class Main{static int N = 2510, M = 2 * 6200 + 10;static int n, m, S, T, idx;static int[] dist = new int[N];static int[] h = new int[N], ne = new int[M], e = new int[M], w = new int[M];//邻接表static boolean[] st = new boolean[N];//邻接表存储public static void add(int a, int b, int c){e[idx] = b;w[idx] = c;ne[idx] = h[a];h[a] = idx ++;}public static void dijkstra(){PriorityQueue<PII> q = new PriorityQueue<>();//优先队列Arrays.fill(dist, 0x3f3f3f3f);dist[S] = 0;q.offer(new PII(0, S));while(!q.isEmpty()){PII t = q.poll();int distance = t.distance;//到起点的距离int num = t.num;//点的编号if(st[num]) continue;//遍历过了st[num] = true;//标记为遍历过for(int i = h[num]; i != -1; i = ne[i]){int j = e[i];if(dist[j] > distance + w[i]){dist[j] = distance + w[i];if(!st[j]) q.offer(new PII(dist[j], j));}}}}public static void main(String[] args){Scanner sc = new Scanner(System.in);n = sc.nextInt();//点m = sc.nextInt();//边S = sc.nextInt();//起点T = sc.nextInt();//终点//建图Arrays.fill(h, -1);//这个一定要记得for(int i = 0; i < m; i ++){int a = sc.nextInt();int b = sc.nextInt();int c = sc.nextInt();add(a, b, c);//无向图add(b, a, c);}dijkstra();System.out.print(dist[T]);}
}

1128. 信使 - AcWing题库

        这道题是让我们求出指挥部到所有点的最短距离,取一个最大值,如果存在一个点距离指挥部的距离是正无穷的话,就输出-1。 

        这道题虽然是让我们求单源最短路,但是我们也可以用多源最短路的Floyd算法来求。

Floyd算法 

import java.util.*;public class Main{static int N = 110;static int[][] dist = new int[N][N];static int n, m;public static void main(String[] args){Scanner sc = new Scanner(System.in);n = sc.nextInt();m = sc.nextInt();for(int i = 1; i <= n; i ++){for(int j = 1; j <= n; j ++){if(i == j) dist[i][j] = 0;else dist[i][j] = 0x3f3f3f3f;}}for(int i = 1; i <= m; i ++){int a = sc.nextInt();int b = sc.nextInt();int c = sc.nextInt();dist[a][b] = dist[b][a] = Math.min(dist[a][b], c);//防止出现重边}//开始Floy算法for(int k = 1; k <= n; k ++){for(int i = 1; i <= n; i ++){for(int j = 1; j <= n; j ++){dist[i][j] = Math.min(dist[i][j], dist[i][k] + dist[k][j]);}}}//找到最大的那条最短路径int res = 0;for(int i = 1; i <= n; i ++){if(dist[1][i] == 0x3f3f3f3f){res = -1;break;}res = Math.max(res, dist[1][i]);}//输出最大值System.out.print(res);}
}

 

 1127. 香甜的黄油 - AcWing题库

        这道题是本质上是一个多源最短路问题,让我们算出每个点到其他点的距离之和的最小值,但是这道题的数据很大,如果用Floyd算法会超时,所以这里我们可以用spfa算法算出n个点的情况,去一个最小值。

spfa算法 

import java.util.*;public class Main{static int N = 810, M = 3000, INF = 0x3f3f3f3f;static int n, m, p, idx;static int[] id = new int[N];//奶牛所在牧场编号static int[] q = new int[N];//循环队列static int[] h = new int[N], e = new int[M], ne = new int[M], w = new int[M];static boolean[] st = new boolean[N];static int[] dist = new int[N];public static void add(int a, int b, int c){e[idx] = b;w[idx] = c;ne[idx] = h[a];h[a] = idx ++;}public static int spfa(int u){Arrays.fill(dist, INF);dist[u] = 0;int hh = 0, tt = 1;q[0] = u;st[u] = true;while(hh != tt){int t = q[hh ++];if(hh == N) hh = 0;st[t] = false;for(int i = h[t]; i != -1; i = ne[i]){int j = e[i];if(dist[j] > dist[t] + w[i]){dist[j] = dist[t] + w[i];if(!st[j]){q[tt ++] = j;if(tt == N) tt = 0;st[j] = true;}}}}int res = 0;for(int i = 0; i < n; i ++){int j = id[i];//奶牛所在牧场编号if(dist[j] == INF){return INF;} res += dist[j];}return res;}public static void main(String[] args){Scanner sc = new Scanner(System.in);n = sc.nextInt();p = sc.nextInt();m = sc.nextInt();Arrays.fill(h, -1);for(int i = 0; i < n; i ++){id[i] = sc.nextInt();}for(int i = 1; i <= m; i ++){int a = sc.nextInt();int b = sc.nextInt();int c = sc.nextInt();add(a, b, c);//无向图add(b, a, c);}int res = INF;for(int i = 1; i <= p; i ++){//所有奶牛到第i个牧场的距离之和res = Math.min(res, spfa(i));}System.out.print(res);}
}

 

 1126. 最小花费 - AcWing题库

这道题要我们求a的最少钱数,因为有100=da*w1*w2*...(其中这里的w是指1-手续费%,也就是汇率),要先da最小,那么就是说要w的乘积最大 

朴素版dijkstra算法 

import java.util.*;public class Main{static int N = 2010;static int n, m, start, end;static double[][] g = new double[N][N];//邻接矩阵存储边static double[] dist = new double[N];//起点到其他点的距离static boolean[] st = new boolean[N];public static void dijkstra(){//Arrays.fill(dist, 0x3f3f3f3f);我们要求的是dist的最大值,所以这里不需要这句话dist[start] = 1;for(int i = 1; i <= n; i ++){//遍历n次,每次找到一个int t = -1;for(int j = 1; j <= n; j ++){if(!st[j] && (t == -1 || dist[j] > dist[t])){t = j;}}st[t] = true;//标记为遍历过for(int j = 1; j <= n; j ++){dist[j] = Math.max(dist[j], dist[t] * g[t][j]);}}}public static void main(String[] args){Scanner sc = new Scanner(System.in);n = sc.nextInt();m = sc.nextInt();for(int i = 0; i < m; i ++){int a = sc.nextInt();int b = sc.nextInt();int c = sc.nextInt();double z = (100.0 - c) / 100.0;//这里为什么取最大值?因为原本是要求c最小的,而现在的z与c的关系是相反的,所以取最大g[a][b] = g[b][a] = Math.max(g[a][b], z);//防止重边}start = sc.nextInt();end = sc.nextInt();dijkstra();//我们求的dist是w乘积的最大值,如果想要da的最大值,就要用100来除distSystem.out.printf("%.8f", 100.0 / dist[end]);}
}

 

920. 最优乘车 - AcWing题库

换车的最小次数=坐车的最小次数 - 1 

由于这道题所有边的权重是1,所以可以直接用bfs,不需要用dijkstra、spfa什么的

import java.util.*;
import java.io.*;public class Main{static int N = 510;static int n, m, res, INF = 0x3f3f3f3f;static int[] q = new int[N];//用数组来模拟队列static boolean[][] g = new boolean[N][N];//true表示连通,false表示不连通static int[] dist = new int[N];//最小坐车次数static int[] cnt = new int[N];//每条线路经过的巴士站public static void bfs(){Arrays.fill(dist, INF);dist[1] = 0;int hh = 0, tt = -1;q[++ tt] = 1;while(hh <= tt){int t = q[hh ++];//取出队头for(int i = 1; i <= n; i ++){if(g[t][i] && dist[i] > dist[t] + 1){dist[i] = dist[t] + 1;q[++ tt] = i;}}}}public static void main(String[] args)throws IOException{BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String[] s = br.readLine().split(" ");m = Integer.parseInt(s[0]);n = Integer.parseInt(s[1]);for(int i = 0; i < m; i ++){String[] arr = br.readLine().split(" ");int len = arr.length;//这条线路经过多少个车站for(int j = 0; j < len; j ++) cnt[j] = Integer.parseInt(arr[j]);for(int j = 0; j < len; j ++){//这个车站和它后面的车站之间都连通(单程)for(int k = j + 1; k < len; k ++){g[cnt[j]][cnt[k]] = true;//连通置为true}}}bfs();if(dist[n] == INF) System.out.print("NO");else System.out.print(dist[n] - 1);}
}

 

903. 昂贵的聘礼 - AcWing题库

用一个虚拟远点将这些点联系起来,建图 

 

 

import java.util.*;public class Main{static int N = 110;static int n, m;static int[][] g = new int[N][N];//用于建图static int[] dist = new int[N];static boolean[] st = new boolean[N];static int[] level = new int[N];//每个点的等级public static int dijkstra(int down, int up){//因为要枚举多个区间,所以每次开始之前都要进行初始化Arrays.fill(st, false);Arrays.fill(dist, 0x3f3f3f3f);dist[0] = 0;//虚拟远点的距离置为0//朴素版的dijkstra,因为建立了一个虚拟远点,所以循环的时候要从0开始for(int i = 0; i <= n; i ++){int t = -1;for(int j = 0; j <= n; j ++){if(!st[j] && (t == -1 || dist[t] > dist[j])){t = j;}}st[t] = true;//更新其他点的值for(int j = 0; j <= n; j ++){if(level[j] >= down && level[j] <= up){dist[j] = Math.min(dist[j], dist[t] + g[t][j]);}}}return dist[1];}public static void main(String[] args){Scanner sc = new Scanner(System.in);m = sc.nextInt();n = sc.nextInt();//初始化for(int i = 0; i < N; i ++){Arrays.fill(g[i], 0x3f3f3f3f);}for(int i = 0; i < N; i ++){g[i][i] = 0;}//建图for(int i = 1; i <= n; i ++){int price = sc.nextInt();level[i] = sc.nextInt();int cnt = sc.nextInt();//有几种兑换方式g[0][i] = price;//虚拟远点到当前点的距离(不兑换,直接购买)for(int j = 1; j <= cnt; j ++){int id = sc.nextInt();int cost = sc.nextInt();g[id][i] = cost;//兑换物品到当前点的距离}}int res = 0x3f3f3f3f;//枚举等级的左端点,找到最小的等级,因为我们一定要将第一个点包含在内for(int i = level[1] - m; i <= level[1]; i ++) res = Math.min(res, dijkstra(i, i + m));System.out.print(res);}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/715334.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

贝叶斯优化CNN分类(matlab代码)

贝叶斯优化CNN分类matlab代码 数据为Excel分类数据集数据。 数据集划分为训练集、验证集、测试集&#xff0c;比例为8:1:1 数据处理: 在数据加载后&#xff0c;对数据进行了划分&#xff0c;包括训练集、验证集和测试集&#xff0c;这有助于评估模型的泛化能力。 数据标准化…

动态规划(算法竞赛、蓝桥杯)--树形DP没有上司的舞会

1、B站视频链接&#xff1a;E17 树形DP Luogu P1352 没有上司的舞会_哔哩哔哩_bilibili 题目链接&#xff1a;没有上司的舞会 - 洛谷 #include <bits/stdc.h> using namespace std; const int N6010; int n; int w[N]; vector<int>a[N];//邻接表 bool fa[N]; int…

011 Linux_线程概念与创建

前言 本文将会向你介绍线程的概念&#xff0c;以及线程是怎么被创建的 线程概念 一、进程是承担系统资源的基本实体&#xff0c;线程是cpu调度的基本单位 首先&#xff0c;地址空间在逻辑上相当于进程的资源窗口&#xff0c; 每个进程都有这样一个资源窗口。通过地址空间页…

前端面试知识点合集

原型和原型链 任何函数都可以作为构造函数。当该函数通过 new 关键字调用的时候&#xff0c;就称之为构造函数。 var Parent function(){}//定义一个函数&#xff0c;那它只是一个普通的函数&#xff0c;不能称它为构造函数var instance new Parent(); //这时这个Parent就不…

C#理论 —— WPF 应用程序Console 控制台应用

文章目录 1. WPF 应用程序1.1 工程创建1.2 控件1.2.1 控件的公共属性1.2.1 TextBox 文本框1.2.1 Button 按钮 *. Console 控制台应用1.1 工程创建 1. WPF 应用程序 1.1 工程创建 Visual Studio 中新建项目 - 选择WPF 应用程序&#xff1b; 1.2 控件 1.2.1 控件的公共属性 …

Linux网络编程——网络基础

Linux网络编程——网络基础 1. 网络结构模式1.1 C/S 结构1.2 B/S 结构 2. MAC 地址3. IP地址3.1 简介3.2 IP 地址编址方式 4. 端口4.1 简介4.2 端口类型 5. 网络模型5.1 OSI 七层参考模型5.2 TCP/IP 四层模型 6. 协议6.1 简介6.2 常见协议6.3 UDP 协议6.4 TCP 协议6.5 IP 协议6…

【兔子机器人】根据自身机器人参数修改simulink模型

关节电机 机体初始高度 &#xff01;&#xff01;&#xff01;接下来尝试修改各腿的坐标朝向

LeetCode54题:螺旋矩阵(python3)

路径的长度即为矩阵中的元素数量&#xff0c;当路径的长度达到矩阵中的元素数量时即为完整路径&#xff0c;将该路径返回。 循环打印&#xff1a; “从左向右、从上向下、从右向左、从下向上” 四个方向循环打印。 class Solution:def spiralOrder(self, matrix: List[List[i…

怎么对App进行功能测试

测试人员常被看作是bug的寻找者&#xff0c;但你曾想过他们实际是如何开展测试的吗&#xff1f;你是否好奇他们究竟都做些什么&#xff0c;以及他们如何在一个典型的技术项目中体现价值&#xff1f;本文将带你经历测试人员的思维过程&#xff0c;探讨他们测试app时的各种考虑. …

Android和Linux的嵌入式开发差异

最近开始投入Android的怀抱。说来惭愧&#xff0c;08年就听说这东西&#xff0c;当时也有同事投入去看&#xff0c;因为恶心Java&#xff0c;始终对这玩意无感&#xff0c;没想到现在不会这个嵌入式都快要没法搞了。为了不中年失业&#xff0c;所以只能回过头又来学。 首先还是…

【C语言】linux内核generic_xdp_tx

一、中文注释 /* 在执行通用XDP时&#xff0c;我们必须绕过qdisc层和网络挖掘点&#xff0c;* 以匹配驱动内XDP的行为。*/ void generic_xdp_tx(struct sk_buff *skb, struct bpf_prog *xdp_prog) {struct net_device *dev skb->dev; // 获取skb对应的网络设备struct netd…

面试高频率问答题目

索引&#xff1a; 主键索引&#xff1a;表的id &#xff08;唯一 且 不能为空&#xff09; 唯一索引&#xff1a;表User 假设有account 字段 &#xff0c;用户名不重复 &#xff08;唯一 可以为空&#xff09; 复合索引&#xff1a;where() 的条件 用户名&#xff0c;密码 …

MySQL:函数

提醒&#xff1a; 设定下面的语句是在数据库名为 db_book里执行的。 创建user_info表 注意&#xff1a;pwd为密码字段&#xff0c;这里使用了VARCHAR(128)类型&#xff0c;为了后面方便对比&#xff0c;开发项目里一般使用char(32)&#xff0c;SQL语句里使用MD5加密函数 USE db…

【博图TIA-Api】通过Excel自动新建文件夹和导入FB块

【博图TIA-Api】通过Excel自动新建文件夹和导入FB块 说明思路准备获取Excel表格内文件名和FB块名等信息新建文件夹部分筛分获取的文件夹数据&#xff0c;去掉重复内容创建文件夹 导入FB块导出FB块的xml文件查找需要放置的文件夹导入块 说明 续上一篇文章&#xff0c;这次是根据…

多线程 --- [ 线程池、线程安全、其他常见的锁 ]

目录 1. 线程池 模块一&#xff1a;线程的封装 模块二&#xff1a;线程池的封装 模块三&#xff1a;互斥量的封装 (RAII风格) 模块四&#xff1a;任务的封装 模块五&#xff1a;日志的封装 模块六&#xff1a;时间的封装 模块六&#xff1a;主函数 模块七&#xff1a…

备战蓝桥杯---状态压缩DP进阶题1

我们来看一看一道比较难的问题&#xff08;十分十分的巧妙&#xff09;&#xff1a; 显然我们应该一行一行放&#xff0c;又竖的会对下一行产生影响&#xff0c;我们令横着放为0&#xff0c;竖着放的上方为1. 对于下一行&#xff0c;前一行放1的下面为0&#xff0c;但是会出现…

前端【技术类】资源学习网站整理(那些年的小网站)

学习网站整理 值得分享的视频博主&#xff1a;学习网站链接 百度首页的资源收藏里的截图&#xff08;排列顺序没有任何意义&#xff0c;随性而已~&#xff09;&#xff0c;可根据我标注的关键词百度搜索到这些网站呀&#xff0c;本篇末尾会一一列出来&#xff0c;供大家学习呀 …

彻底搞懂回溯算法(例题详解)

目录 什么是回溯算法&#xff1a; 子集问题&#xff1a; 子集问题II(元素可重复但不可复选): 组合问题&#xff1a; 组合问题II(元素可重复但不可复选): 排列问题&#xff1a; 排列问题II(元素可重复但不可复选): 什么是回溯算法&#xff1a; 「回溯是递归的副产品&…

leetcode hot100 每日温度

在本题中&#xff0c;我们是通过单调栈来解决的&#xff0c;因为我们采用了栈的数据结构&#xff0c;并且&#xff0c;栈内存储的元素是单调的。 本题我们考虑&#xff0c;将气温数组元素的下标存入栈中&#xff0c;首先初始化要把0放入&#xff0c;0是下标的意思。然后我们拿…

华为HCIP Datacom H12-821 卷4

1.单选题 下面哪些策略或工具不能够应用于 OSPF: A、access-list B、prefix-list C、route- Policy D、as-path filter 正确答案&#xff1a; D 解析&#xff1a; as-path-filter命令用来创建AS路径过滤器&#xff0c;OSPF属于IGP协议&#xff0c;不涉及到AS号。 2.单选题…