当前位置: 首页 > article >正文

2.10学习总结

Dijkstra算法求取最短路径

注:迪杰斯特拉算法并不能直接生成最短路径,但是算法将最短路径信息保存在dist数组和path数组中。

  1. dist数组中保存的是起始点到数组下标对应顶点的路径长度(累加的结果)
  2. path数组中保存的是对应path数组下标顶点的前驱顶点(前一个顶点)
#include <stdio.h>
#include <stdlib.h>
#define VertexMax 20 //最大顶点数为20
#define MaxInt 32767 //表示最大整数,表示 ∞ typedef char VertexType; //每个顶点数据类型为字符型 typedef struct
{VertexType Vertex[VertexMax];//存放顶点元素的一维数组 int AdjMatrix[VertexMax][VertexMax];//邻接矩阵二维数组 int vexnum,arcnum;//图的顶点数和边数  
}MGraph;int LocateVex(MGraph *G,VertexType v)//查找元素v在一维数组 Vertex[] 中的下标,并返回下标 
{int i;for(i=0;i<G->vexnum;i++){if(v==G->Vertex[i]){return i; } } printf("No Such Vertex!\n");return -1;
}void CreateDN(MGraph *G) 
{int i,j;//1.输入顶点数和边数 printf("输入顶点个数和边数:\n");printf("顶点数 n="); scanf("%d",&G->vexnum);printf("边  数 e="); scanf("%d",&G->arcnum);//2.输入顶点元素 printf("输入顶点元素(无需空格隔开):");scanf("%s",G->Vertex);printf("\n");//3.矩阵初始化for(i=0;i<G->vexnum;i++) for(j=0;j<G->vexnum;j++){G->AdjMatrix[i][j]=MaxInt;}//4.构建邻接矩阵int n,m;VertexType v1,v2;int w;//v1->v2的权值 printf("输入路径及路径长度:\n");for(i=0;i<G->arcnum;i++){printf("输入第%d条路径信息:",i+1);scanf(" %c%c,%d",&v1,&v2,&w);n=LocateVex(G,v1); //获取v1所对应的在Vertex数组中的坐标 m=LocateVex(G,v2); //获取v2所对应的在Vertex数组中的坐标if(n==-1||m==-1){printf("NO This Vertex!\n");return;} G->AdjMatrix[n][m]=w;}
}void print(MGraph G)
{int i,j;printf("\n-----------------------------------------------");printf("\n 邻接矩阵:\n\n"); printf("\t ");for(i=0;i<G.vexnum;i++)printf("\t%c",G.Vertex[i]);printf("\n");for(i=0;i<G.vexnum;i++){printf("\t%c",G.Vertex[i]);for(j=0;j<G.vexnum;j++){if(G.AdjMatrix[i][j]==MaxInt)printf("\t∞");else printf("\t%d",G.AdjMatrix[i][j]);}printf("\n");}}void displayPath(int dist[],int path[],MGraph *G,VertexType start)
{int i,k,j=0;int temp[VertexMax];//临时数组 VertexType target;//目标地点 int loc=0; for(i=0;i<VertexMax;i++)temp[i]=-1;printf("\n-----------------------------------------------\n");printf("结果展示:\n");printf("\n\n");//打印dist数组 printf("\tdist[i]:\n\t");for(i=0;i<G->vexnum;i++)printf("\t%d",i);printf("\n\t"); for(i=0;i<G->vexnum;i++){printf("\t%d",dist[i]);}printf("\n");printf("\n\n");//打印path数组 printf("\n\tpath[i]:\n\t");for(i=0;i<G->vexnum;i++)printf("\t%d",i);printf("\n\t"); for(i=0;i<G->vexnum;i++){printf("\t%d",path[i]);}printf("\n\n"); //最短路径 printf("最短路径:\n\n"); for(i=0;i<G->vexnum;i++){loc=i;j=0;while(loc!=-1){temp[j]=loc;loc=path[loc];j++;}if(j-1==0&&G->Vertex[temp[j-1]]==start){printf("\t");printf("%c->%c:%c为起始点!",start,G->Vertex[i],G->Vertex[temp[j-1]]);}else if(j-1==0&&G->Vertex[temp[j-1]]!=start){printf("\t");printf("%c->%c:%c不可达%c",start,G->Vertex[i],start,G->Vertex[temp[j-1]]);}else{printf("\t");printf("%c->%c:",start,G->Vertex[i]);for(j=j-1;j>=0;j--){printf("%c ",G->Vertex[temp[j]]);}printf("(总路径长度:%d)",dist[i]);}for(k=0;k<20;k++)temp[k]=-1;printf("\n\n"); }
}int FindMinDist(int dist[],int s[],int vexnum) 
{int i;int loc;int min=MaxInt+1;for(i=0;i<vexnum;i++){if(s[i]==0)//只对s[i]=0的顶点进行查找 {if(dist[i]<min){min=dist[i];loc=i;}}}return loc;//返回dist中最小元素的下标 
}void ShortestPath_Dijkstra(MGraph *G,VertexType start)
{int i,j,num;int loc;int min;int dist[VertexMax];//最短路径长度数组 int path[VertexMax];//最短路径数组 int s[VertexMax];//代表集合S(1代表该顶点已处理,属于集合S;0代表该顶点未处理,不属于集合S,属于集合V-S) //1.初始化dist和path数组 loc=LocateVex(G,start);//获取源点的下标位置 for(i=0;i<G->vexnum;i++){dist[i]=G->AdjMatrix[loc][i];if(dist[i]!=MaxInt){path[i]=loc;}else{path[i]=-1;}	  } //2.初始化S数组(s数组:代表集合S,1代表该元素属于集合S(已处理的顶点),0该元素不属于集合S(未处理的顶点)) for(i=0;i<G->vexnum;i++){s[i]=0;} s[loc]=1;//代表起始点(源点)以处理完毕 num=1;//3.while(num<G->vexnum){min=FindMinDist(dist,s,G->vexnum);//在dist数组中查找其对应s[i]=0,即未处理的最小值元素 s[min]=1;//将找到的最短边所对应的的顶点加入集合Sfor(i=0;i<G->vexnum;i++)//加入新的顶点后,更新dist和path数组 {if((s[i]==0)&&(dist[i]>dist[min]+G->AdjMatrix[min][i]))//{dist[i]=dist[min]+G->AdjMatrix[min][i];path[i]=min;//min->i}}num++;	} displayPath(dist,path,G,start);//展示dist数组、path数组及最短路径 } int main() 
{MGraph G;VertexType start;CreateDN(&G);print(G); printf("输入起始点:"); scanf(" %c",&start);printf("\n");ShortestPath_Dijkstra(&G,start);return 0;
}

,洛谷p2021feabdc玩扑克

(也可以尝试链表解决

#include<stdio.h>
int a[1000], n, s;
int main() {scanf("%d", &n);for (int i = 1;i <= n;i++) {for (int j = 1;j <= 2;j++) {s++;if (s > n)s = 1;if (a[s] != 0)j--;}a[s] = i;}for (int i = 1;i <= n;i++) {printf("%d ", a[i]);}return 0;
}

相关文章:

2.10学习总结

Dijkstra算法求取最短路径 注&#xff1a;迪杰斯特拉算法并不能直接生成最短路径&#xff0c;但是算法将最短路径信息保存在dist数组和path数组中。 dist数组中保存的是起始点到数组下标对应顶点的路径长度&#xff08;累加的结果&#xff09;path数组中保存的是对应path数组…...

【探索未来科技】2025年国际学术会议前瞻

【探索未来科技】2025年国际学术会议前瞻 【探索未来科技】2025年国际学术会议前瞻 文章目录 【探索未来科技】2025年国际学术会议前瞻前言1. 第四届电子信息工程、大数据与计算机技术国际学术会议&#xff08; EIBDCT 2025&#xff09;代码示例&#xff1a;机器学习中的线性回…...

pytest.fixture

pytest.fixture 是 pytest 测试框架中的一个非常强大的功能,它允许你在测试函数运行前后执行一些设置或清理代码。以下是关于 pytest.fixture 的详细介绍: 一、定义与用途 pytest.fixture 是一个装饰器,用于标记一个函数为 fixture。Fixture 函数中的代码可以在测试函数运…...

大模型基本原理(四)——如何武装ChatGPT

传统的LLM存在几个短板&#xff1a;编造事实、计算不准确、数据过时等&#xff0c;为了应对这几个问题&#xff0c;可以借助一些外部工具或数据把AI武装起来。 实现这一思路的框架包括RAG、PAL、ReAct。 1、RAG&#xff08;检索增强生成&#xff09; LLM生成的内容会受到训练…...

开发完的小程序如何分包

好几次了&#xff0c;终于想起来写个笔记记一下 我最开始并不会给小程序分包&#xff0c;然后我就各种搜&#xff0c;发现讲的基本上都是开发之前的小程序分包&#xff0c;可是我都开发完要发布了&#xff0c;提示我说主包太大需要分包&#xff0c;所以我就不会了。。。 好了…...

java配置api,vue网页调用api从oracle数据库读取数据

一、主入口文件 1&#xff1a;java后端端口号 2&#xff1a;数据库类型 和 数据库所在服务器ip地址 3&#xff1a;服务器用户名和密码 二、映射数据库表中的数据 resources/mapper/.xml文件 1&#xff1a;column后变量名是数据库中存储的变量名 property的值是column值的…...

iOS三方登录 - Facebook登录

引言 在出海APP的开发中&#xff0c;集成主流社交平台的三方登录已成为必不可少的一环。Facebook 作为全球最大的社交网络平台之一&#xff0c;其提供的 Facebook 登录功能能够大大简化用户注册和登录流程&#xff0c;提高用户体验&#xff0c;减少流失率。对于开发者而言&…...

使用 OpenGL ES 渲染一个四边形

使用 OpenGL ES 渲染一个四边形 在 iOS 开发中,OpenGL ES 是一个强大的工具,用于实现高性能的 2D 和 3D 图形渲染。本文将通过一个完整的代码示例,详细解析如何使用 OpenGL ES 渲染一个简单的四边形。我们将从基础概念入手,逐步讲解代码的每个部分,帮助你理解 OpenGL ES …...

机器学习 - 理解偏差-方差分解

为了避免过拟合&#xff0c;我们经常会在模型的拟合能力和复杂度之间进行权衡。拟合能力强的模型一般复杂度会比较高&#xff0c;容易导致过拟合。相反&#xff0c;如果限制模型的复杂度&#xff0c;降低其拟合能力&#xff0c;又可能会导致欠拟合。因此&#xff0c;如何在模型…...

深入解析 Android 系统属性 跨进程 API:SystemProperties、ContentObserver 的使用

基础篇.系统属性 & 跨进程 API &#x1f4e2; 1. 职业规划篇 来聊聊安卓职业规划&#xff1f;整机开发大专能做么&#xff1f; &#x1f4e2; 2.基础篇 基础篇.前言 基础篇.编译环境搭建 基础篇.源码目录简介 基础篇.系统 mk_bp 讲解 基础篇.开机动画定制 基础篇.定制桌面壁…...

从 .NET Framework 升级到 .NET 8 后 SignalR 问题处理与解决方案

随着 .NET Framework 向 .NET 8 的迁移&#xff0c;许多开发者在使用 SignalR 时遇到了一些前后端连接、配置、调用等方面的问题。尤其是在处理 SignalR 实时通信功能时&#xff0c;升级后的一些兼容性问题可能导致应用程序无法正常工作。本文将介绍在从 .NET Framework 升级到…...

深入解析 Linux 系统中 Cron 定时任务的配置与管理

在 Linux 和类 Unix 系统中&#xff0c;cron 是一个非常强大的工具&#xff0c;用于定时执行各种任务&#xff0c;例如自动备份、定时运行脚本和定期清理日志文件。通过合理配置 cron&#xff0c;你可以让很多系统维护任务自动化&#xff0c;从而减轻日常管理的压力。而 cronta…...

深度学习01 神经网络

目录 神经网络 ​感知器 感知器的定义 感知器的数学表达 感知器的局限性 多层感知器&#xff08;MLP, Multi-Layer Perceptron&#xff09; 多层感知器的定义 多层感知器的结构 多层感知器的优势 偏置 偏置的作用 偏置的数学表达 神经网络的构造 ​神经网络的基本…...

ffmpeg基本用法

一、用法 ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}... 说明&#xff1a; global options&#xff1a;全局选项&#xff0c;应用于整个 FFmpeg 进程&#xff0c;它们通常不受输入或输出部分的限制。 infile options&#xff1a;输入选…...

强化学习 DPO 算法:基于人类偏好,颠覆 PPO 传统策略

目录 一、引言二、强化学习基础回顾&#xff08;一&#xff09;策略&#xff08;二&#xff09;价值函数 三、近端策略优化&#xff08;PPO&#xff09;算法&#xff08;一&#xff09;算法原理&#xff08;二&#xff09;PPO 目标函数&#xff08;三&#xff09;代码示例&…...

【HDSF】ProtobufRpcEngine 和 ProtobufRpcEngine2

ProtobufRpcEngine2的call方法实现如下,它对历史版本的protobuf实现进行了兼容。 即同时支持protobuf 2.5.0 和protobuf 3.x版本的RPC通信。 看下具体是怎么实现的? @SuppressWarnings("deprecation")protected Writable call(RPC.Server server, String connecti…...

Redis中的某一热点数据缓存过期了,此时有大量请求访问怎么办?

1、提前设置热点数据永不过期 2、分布式中用redis分布式锁&#xff08;锁可以在多个 JVM 实例之间协调&#xff09;、单体中用synchronized&#xff08;锁只在同一个 JVM 内有效&#xff09; 编写服务类 import com.redisson.api.RLock; import com.redisson.api.RedissonCli…...

IntelliJ IDEA 安装与使用完全教程:从入门到精通

一、引言 在当今竞争激烈的软件开发领域&#xff0c;拥有一款强大且高效的集成开发环境&#xff08;IDE&#xff09;是开发者的致胜法宝。IntelliJ IDEA 作为 JetBrains 公司精心打造的一款明星 IDE&#xff0c;凭借其丰富多样的功能、智能精准的代码提示以及高效便捷的开发工…...

自动化xpath定位元素(附几款浏览器xpath插件)

在 Web 自动化测试、数据采集、前端调试中&#xff0c;XPath 仍然是不可或缺的技能。虽然 CSS 选择器越来越强大&#xff0c;但面对复杂 DOM 结构时&#xff0c;XPath 仍然更具灵活性。因此&#xff0c;掌握 XPath&#xff0c;不仅能提高自动化测试的稳定性&#xff0c;还能在爬…...

PromptSource官方文档翻译

目录 核心概念解析 提示模板&#xff08;Prompt Template&#xff09; P3数据集 安装指南 基础安装&#xff08;仅使用提示&#xff09; 开发环境安装&#xff08;需创建提示&#xff09; API使用详解 基本用法 子数据集处理 批量操作 提示创建流程 Web界面操作 手…...

2025年软件测试五大趋势:AI、API安全、云测试等前沿实践

随着软件开发的不断进步&#xff0c;测试方法也在演变。企业需要紧跟新兴趋势&#xff0c;以提升软件质量、提高测试效率&#xff0c;并确保安全性&#xff0c;在竞争激烈的技术环境中保持领先地位。本文将深入探讨2025年最值得关注的五大软件测试趋势。 Parasoft下载https://…...

js的DOM一遍过

一、获取元素 1.根据id获取 document.getElementById(id);2.根据标签名获取 使用 getElementsByTagName() 方法可以返回带有指定标签名的对象的集合。 document.getElementsByTagName(标签名);获取某个元素(父元素)内部所有指定标签名的子元素。 element.getElementsByTag…...

Machine Learning:Introduction

文章目录 Machine LearningTrainingStep 1.Contract Function with Unknown ParametersStep 2.Define Loss from Training DataStep 3.Optimization Linear ModelPiecewise Linear CurveBeyond Piecewise Liner?FunctionLossOptimization Model Deformation Machine Learning …...

Excel 笔记

实际问题记录 VBA脚本实现特殊的行转列 已知&#xff1a;位于同一Excel工作簿文件中的两个工作表&#xff1a;Sheet1、Sheet2。 问题&#xff1a;现要将Sheet2中的每一行&#xff0c;按Sheet1中的样子进行转置&#xff1a; Sheet2中每一行的黄色单元格&#xff0c;为列头。…...

基于 GEE 利用插值方法填补缺失影像

目录 1 完整代码 2 运行结果 利用GEE合成NDVI时&#xff0c;如果研究区较大&#xff0c;一个月的影像覆盖不了整个研究区&#xff0c;就会有缺失的地方&#xff0c;还有就是去云之后&#xff0c;有云量的地区变成空值。 所以今天来用一种插值的方法来填补缺失的影像&#xf…...

如何设置爬虫的IP代理?

在爬虫开发中&#xff0c;设置IP代理是避免被目标网站封禁、提升爬取效率和保护隐私的重要手段。以下是设置爬虫IP代理的详细方法和注意事项&#xff1a; 一、获取代理IP 免费代理IP&#xff1a; 可以通过一些免费的代理IP网站获取代理IP&#xff0c;但这些IP的稳定性和速度通…...

如何在浏览器中搭建开源Web操作系统Puter的本地与远程环境

文章目录 前言1.关于Puter2.本地部署Puter3.Puter简单使用4. 安装内网穿透5.配置puter公网地址6. 配置固定公网地址 前言 嘿&#xff0c;小伙伴们&#xff01;是不是每次开机都要像打地鼠一样不停地点击各种网盘和应用程序的登录按钮&#xff0c;感觉超级麻烦&#xff1f;更让…...

使用EVE-NG-锐捷实现单臂路由

一、基础知识 1.三层vlan vlan在三层环境中通常用作网关vlan配上ip网关内部接口ip 2.vlan创建步骤 创建vlan将接口划分到不同的vlan给vlan配置ip地址 二、项目案例 1、项目拓扑 2、项目实现 PC1配置 配置PC1IP地址为192.168.1.10/24网关地址为192.168.1.1 ip 192.168.1…...

二、通义灵码插件保姆级教学-IDEA(使用篇)

一、IntelliJ IDEA 中使用指南 1.1、代码解释 选择需要解释的代码 —> 右键 —> 通义灵码 —> 解释代码 解释代码很详细&#xff0c;感觉很强大有木有&#xff0c;关键还会生成流程图&#xff0c;对程序员理解业务非常有帮忙&#xff0c;基本能做到哪里不懂点哪里。…...

水下 SLAM 定位模组的设计与实现

标题:水下 SLAM 定位模组的设计与实现 内容:1.摘要 摘要&#xff1a;本文介绍了水下 SLAM 定位模组的设计与实现。首先&#xff0c;对水下定位技术的背景和需求进行了分析。然后&#xff0c;详细阐述了模组的设计思路和关键技术&#xff0c;包括传感器选型、数据融合算法等。接…...