2.10学习总结

news/2025/2/11 18:25:48/

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;
}


http://www.ppmy.cn/news/1571219.html

相关文章

使用 mkcert 本地部署启动了 TLS/SSL 加密通讯的 MongoDB 副本集和分片集群

MongoDB 是支持客户端与 MongoDB 服务器之间启用 TLS/SSL 进行加密通讯的, 对于 MongoDB 副本集和分片集群内部的通讯, 也可以开启 TLS/SSL 认证. 本文会使用 mkcert 创建 TLS/SSL 证书, 基于创建的证书, 介绍 MongoDB 副本集、分片集群中启动 TLS/SSL 通讯的方法. 我们将会在…

计算机网络知识速记:TCP 与 UDP

计算机网络知识速记&#xff1a;TCP 与 UDP 一、概念 TCP (Transmission Control Protocol): 一个面向连接的协议&#xff0c;确保数据在传输过程中完整无误。通过建立连接和数据确认机制&#xff0c;提高数据传输的可靠性。是面向字节传输的。 UDP (User Datagram Protocol)…

Python3+Request+Pytest+Allure+Jenkins 接口自动化测试[手动写的和AI写的对比]

我手动写的参考 总篇:Python3+Request+Pytest+Allure+Jenkins接口自动化框架设计思路_jenkins python3+request-CSDN博客 https://blog.csdn.net/fen_fen/article/details/144269072 下面是AI写的:Python3+Request+Pytest+Allure+Jenkins 接口自动化测试[AI文章框架] 在软…

DeepSeek与人工智能的结合:探索搜索技术的未来

云边有个稻草人-CSDN博客 目录 引言 一、DeepSeek的技术背景 1.1 传统搜索引擎的局限性 1.2 深度学习在搜索中的优势 二、DeepSeek与人工智能的结合 2.1 自然语言处理&#xff08;NLP&#xff09; 示例代码&#xff1a;基于BERT的语义搜索 2.2 多模态搜索 示例代码&…

面试经典150题——字典树

文章目录 1、实现 Trie (前缀树)1.1 题目链接1.2 题目描述1.3 解题代码1.4 解题思路 2、添加与搜索单词 - 数据结构设计2.1 题目链接2.2 题目描述2.3 解题代码2.4 解题思路 3、单词搜索 II3.1 题目链接3.2 题目描述3.3 解题代码3.4 解题思路 对于字典树而言&#xff0c;之前做过…

C++ labmbd表达式

文章目录 C++ Lambda 表达式详解1. Lambda 表达式的组成部分:2. Lambda 语法示例(1) 最简单的 Lambda(2) 带参数的 Lambda(3) 指定返回类型的 Lambda3. 捕获外部变量(1) 值捕获(复制)(2) 引用捕获(3) 捕获所有变量4. Lambda 在 STL 中的应用5. Lambda 作为 `std::function`6…

web前端录制canvas视频和video的声音,并合并成一个文件进行下载

一、captureStream ‌captureStream‌是一个Web API方法&#xff0c;用于捕获指定元素的媒体流。该方法通常用于从<video>、<audio>或<canvas>元素中捕获实时视频流或音频流&#xff0c;以便进行进一步的处理&#xff0c;如直播、录制或分析‌。 captureStr…

Elasticsearch 7 集群搭建问题排查:常见故障解决方案与优化技巧

引言 Elasticsearch 作为一种强大的分布式搜索引擎,已被广泛应用于各种场景,特别是在日志聚合、数据分析等领域中。然而,在实际部署中,尤其是集群搭建阶段,许多用户都会遇到配置问题,导致集群无法成功建立。在本文中,我们将通过一个实际的案例,详细分析和排查 Elastic…