Code Practice Journal | Day59-60_Graph09 最短路径(待更)

news2024/9/19 19:39:30

1. Dijkstra

1.1 原理与步骤

步骤:

  1. 选取距离源点最近且未被访问过的节点
  2. 标记该节点为已访问
  3. 更新未访问节点到源点的距离
1.2 代码实现

以KamaCoder47题为例
题目:47. 参加科学大会(第六期模拟笔试) (kamacoder.com)

class Program
{
    public static void Main(string[] args)
    {
        //处理输入
        string[] dimensions = Console.ReadLine().Split();
        int n = int.Parse(dimensions[0]);
        int m = int.Parse(dimensions[1]);
        //  visited & minDist & graph
        bool[] visited = new bool[n + 1];
        int[] minDist = new int[n + 1];
        int[][] graph = new int[n + 1][];
        for (int i = 0; i <= n; i++)
        {
            graph[i] = new int[n + 1];
            for (int j = 0; j <= n; j++)
            {
                graph[i][j] = int.MaxValue;
            }
        }
        //  填充
        for (int i = 0; i <= n; i++)
        {
            visited[i] = false;
            if (i == 1) minDist[i] = 0;
            else minDist[i] = int.MaxValue;
        }
        for (int i = 0; i < m; i++)
        {
            string[] edges = Console.ReadLine().Split();
            int start = int.Parse(edges[0]);
            int end = int.Parse(edges[1]);
            int weight = int.Parse(edges[2]);
            graph[start][end] = weight;
        }
        //
        int result = Dj(graph, n, visited, minDist);
        Console.WriteLine(result);
    }

    public static int Dj(int[][] graph, int n, bool[] visited, int[] minDist)
    {
        for (int count = 1; count < n + 1; count++)
        {
            //find min node
            int mindist = int.MaxValue;
            int minnode = 0;
            for (int i = 1; i < n + 1; i++)
            {
                if (visited[i] == false)
                {
                    if (minDist[i] < mindist)
                    {
                        minnode = i;
                        mindist = minDist[i];
                    }
                }
            }
            //update visited
            visited[minnode] = true;
            //update minDist
            for (int i = 1; i < n + 1; i++)
            {
                if (graph[minnode][i] != int.MaxValue)
                {
                    minDist[i] = Math.Min(graph[minnode][i] + mindist, minDist[i]);
                }
            }
            Console.WriteLine(string.Join(" ", minDist));
        }

        return minDist[n] == int.MaxValue ? -1 : minDist[n];
    }
}
1.3 堆优化

2. Bellman_ford

2.1 原理与步骤
2.2 代码实现
class Program
{
    public static void Main(string[] args)
    {
        //处理输入
        string[] dimensions = Console.ReadLine().Split();
        int n = int.Parse(dimensions[0]);
        int m = int.Parse(dimensions[1]);
        //minDist
        int[] minDist = new int[n + 1];
        for (int i = 0; i <= n; i++)
        {
            minDist[i] = i == 1 ? 0 : int.MaxValue;
        }
        //edges
        int[][] edges = new int[m][];
        for (int i = 0; i < m; i++)
        {
            edges[i] = new int[3];
            string[] edge = Console.ReadLine().Split();
            edges[i][0] = int.Parse(edge[0]);
            edges[i][1] = int.Parse(edge[1]);
            edges[i][2] = int.Parse(edge[2]);
        }

        //BF
        if (BF(edges, minDist, n - 1))
        {
            Console.WriteLine(minDist[n]);
        }
        else
        {
            Console.WriteLine("unconnected");
        }
    }

    public static bool BF(int[][] edges, int[] minDist, int n)
    {
        bool isUpdate = true;
        int count = 1;
        while (count <= n && isUpdate == true)
        {
            count++;
            isUpdate = false;

            for (int i = 0; i < edges.Length; i++)
            {
                int start = edges[i][0];
                int end = edges[i][1];
                int weight = edges[i][2];
                if (minDist[start] != int.MaxValue)
                {
                    int dist = minDist[start] + weight;
                    if (dist < minDist[end])
                    {
                        minDist[end] = dist;
                        isUpdate = true;
                    }
                }
            }
        }

        return !isUpdate;
    }
}
2.3 队列优化
2.4 应用场景

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

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

相关文章

非开发者也能体验纯血鸿蒙了?15款机型开启鸿蒙NEXT测试招募

非开发者也能体验纯血鸿蒙了&#xff1f;这15款机型正式开启鸿蒙NEXT Beta版测试招募 8月26日&#xff0c;华为发起了新一轮的HarmonyOS NEXT Beta版的升级招募&#xff0c;据了解&#xff0c;此次升级招募面向华为Mate 60系列、华为Mate X5&#xff08;含典藏版&#xff09;、…

Linux: make指令与Makefile文件

目录 1. 场景介绍 2. make指令与Makefile文件 3. 依赖关系和依赖方法 4. 项目清理 5. 原理 5.1 识别文件是否需要编译 5.2 make原理 6. 扩展 总结 1. 场景介绍 Linux操作系统中&#xff0c;我们每编写一个C/C代码&#xff0c;都要手动使用gcc/g指令&#xff0c;对代码…

ffmpeg源码分析(六)内存管理

系列文章目录 FFmpeg源码解析系列&#xff08;一&#xff09;目录和编译 FFmpeg源码解析系列&#xff08;二&#xff09;主要结构体 ffmpeg源码解析系列&#xff08;四&#xff09;结构体之AVIOContext 、URLContext、URLProtocol ffmpeg源码解析系列&#xff08;五&#xff0…

phpstudy怎么用

启动Apache 这是你的默认网站域名。点击物理路径 进入到目录&#xff0c;将你的php文件项目拖进去。如test.php 打开浏览器

python 天气与股票的关系--第2部分,清洗数据

先看一下股票信息 合并天气信息 合并2个数据 合并之后&#xff0c;会自动删除 周六和周日 节假日 下一篇&#xff0c;尝试建立数学模型

生产环境变态开启devtools(redux篇)

前沿 默认都安装了谷歌的redux-devtools插件哦 没有亮,说明关闭了生产环境的redux devtools工具, 接下来跟着博主一起变态启用它 如果看了我上一篇的小伙伴,应该会很熟练了,如果没有看上一篇的,也没关系,博主会手摸手的教你们打开它。 正常的解决方案(适用内部开发人员…

【c++】日期类相关实践:计算日期到天数转换、日期差值

相关文章&#xff1a;日期类&#xff08;运算符重载应用&#xff09;详细版 目录 前言 实践1&#xff1a;计算日期到天数转换 题目 方法 关键代码 完整代码 实践2&#xff1a;日期差值 题目 方法 关键代码 完整代码 &#x1f497;感谢阅读&#xff01;&#x1f49…

python网络爬虫(四)——实战练习

0.为什么要学习网络爬虫 深度学习一般过程:   收集数据&#xff0c;尤其是有标签、高质量的数据是一件昂贵的工作。   爬虫的过程&#xff0c;就是模仿浏览器的行为&#xff0c;往目标站点发送请求&#xff0c;接收服务器的响应数据&#xff0c;提取需要的信息&#xff0c…

Python 算法交易实验85 QTV200日常推进-钳制指标与交易量

说明 继续保持思考与尝试 最近挺有意思的&#xff0c;碰到很多技术上的问题&#xff0c;其解决方案都类似“阴阳两仪”的概念。 "阴阳两仪"是中国古代哲学中的一个重要概念&#xff0c;源自《易经》&#xff08;又称《周易》&#xff09;。它是对宇宙间最基本对立统一…

数据结构与算法 第5天(树和二叉树)

树形结构 一对多 只有一个前驱 可以有多个后继 树的定义 基本术语 有序树&#xff1a;树中结点的各子树从左至右有次序(最左边的为第一个孩子) 森林&#xff1a;是 m(m≥0)棵互不相交的树的集合。 一棵树可以看成特殊的森林 二叉树 每个节点最多有两个…

【王树森】BERT:预训练Transformer模型(个人向笔记)

前言 BERT&#xff1a;Bidirectional Encoder Representations from TransformerBERT是用来预训练Transformer模型的encoder的本节课只讲述主要思想BERT用两个主要思想来训练Transformer的encoder网络&#xff1a;①随机遮挡单词&#xff0c;让encoder根据上下文来预测被遮挡的…

2024年9月1日 十二生肖 今日运势

小运播报&#xff1a;2024年9月1日&#xff0c;星期日&#xff0c;农历七月廿九 &#xff08;甲辰年壬申月戊辰日&#xff09;&#xff0c;法定节假日。 红榜生肖&#xff1a;鸡、猴、鼠 需要注意&#xff1a;龙、兔、狗 喜神方位&#xff1a;东南方 财神方位&#xff1a;正…

【系统架构设计师-2015年】综合知识-答案及详解

【第1~2题】 某航空公司机票销售系统有n个售票点&#xff0c;该系统为每个售票点创建一个进程Pi&#xff08;i1&#xff0c;2&#xff0c;…&#xff0c;n&#xff09;管理机票销售。假设Tj&#xff08;j1&#xff0c;2&#xff0c;…&#xff0c;m&#xff09;单元存放某日某…

2025届必看:如何用Java SpringBoot+Vue打造免费体育馆场地预约系统?

✍✍计算机毕业编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java、…

异常与使用

异常 一、C语言传统的错误处理机制二、异常1、概念2、关键字3、示例 三、异常的使用1、异常的抛出和匹配原则2、在函数调用链中异常栈展开匹配原则3、栈展开示意图4、示例代码5、运行结果 四、异常的重新抛出1、作用2、示例代码3、运行结果 五、异常安全六、异常规范1、概念2、…

CSS-浮动【看这一篇就够了】

目录 浮动布局 浮动是如何工作的 浮动的本质和要点 如何产生浮动 元素浮动的特性 1.元素添加浮动后&#xff0c;脱离文档流 2.如果父元素的宽度不够 3.浮动的顺序贴靠特性 4.元素浮动后&#xff0c;具有行内块级元素特性 5.浮动的元素会造成父元素高度塌陷 6.浮动对…

“无法连接打印机0X0000011B”原因分析及多种解决方法

在日常办公和生活中&#xff0c;打印机是不可或缺的重要设备。然而&#xff0c;有时在连接打印机的过程中&#xff0c;我们可能会遇到错误代码0x0000011b的提示。有更新补丁导致的、有访问共享打印机服务异常、有访问共享打印机驱动异常等问题导致的&#xff0c;针对访问共享打…

MySQL场景测试题

第一题 软件环境描述&#xff1a; Mysql V5.7.30 Innodb RR隔离级别 表结构以及数据描述&#xff1a; &#xff08;1&#xff09;t_user用户表&#xff0c;表格如下&#xff1a; CREATE TABLE t_user ( id int(10) NOT NULL, name varchar(100) DEFAULT NULL, PRIMARY KEY (id)…

240831-Gradio之RAG文档对话工具Kotaemon的安装与配置

A. 用户界面 该项目既可以作为功能性 RAG UI&#xff0c;既可以用于对文档进行 QA 的最终用户&#xff0c;也可以用作想要构建自己的 RAG 管道的开发人员。对于最终用户&#xff1a; - 一个干净且简约的用户界面&#xff0c;用于基于RAG的QA。 - 支持 LLM API 提供程序&#xf…

gethub-rrsf

一.FastCGI协议 1.来到127.0.0.1下发现404报错 2.这一关我们要借助一个叫Gopherus的工具&#xff0c;我这里是在kali虚拟机里面克隆的 git clone https://github.com/tarunkant/Gopherus.git 3.运行命令 由于一句话木马无法写入&#xff0c;所以我们使用base64编码&#xf…