图的各种应用

一:最小生成树(prim算法)

由于prim算法需要频繁的取一条边的权值,采用邻接矩阵存储更加合适。

代码:

void Prim(MatGraph g,int v0,int &sum){int *lowcost=(int*)malloc(sizeof(int)*g.n);//当前树到剩余顶点的最短边 int *vset=(int*)malloc(sizeof(int)*g.n);//当前树的顶点 int v;//工作顶点指针int i,j,k,min;v=v0;//从v0开始执行该算法for(i=0;i<g.n;i++){lowcost[i]=g.edges[v0][i];//初始化lowcost,开始时树中只有v0顶点vset[i]=0;//所有顶点开始都不在树中 } vset[v0]=1;//顶点v0加入到树中sum=0;//用与计算树的权值for(i=0;i<g.n;i++){min=INF;for(j=0;j<g.n;j++){//找出当前树到树外最短的边 if(vset[j]==0&&lowcost[j]<min){min=lowcost[j];k=j;//记录最短边的另一个顶点 }}vest[k]=1;//顶点k加入到树中sum += min;//更新树的权值;v=k;//更新lowcost,判断顶点的加入是否会有更小的值for(j=0;j<g.n;j++){if(vset[j]==0&&g.edges[v][j]<low[j]){lowcost[j]=g.edges[v][j];}} } free(vset);free(lowcost);
}

 时间复杂度O(n^2)

二:最小生成树(Kruskal)算法。

由于Kruskal算法需要频繁的取一条边的权值,采用邻接矩阵存储更加合适。

代码:

typedef struct{int u;//边的起始顶点int v;//边的终止顶点int w;//边的权值 
}Edg;
void Kruskal(MatGraph g){int i,j,u1,v1,sn1,sn2,k;int vset[MAX];Edg E[MAX];//存放图中所有的边k=0;for(i=o;i<g.n;i++){//右邻接矩阵把边集找出来 for(j=0;j<g.n;j++){if(g.edges[i][j]!=0&&g.edges[i][j]!=INF){E[k].u=i;E[k].v=j;E[k].w=g.edges[i][j];k++}}} InsertSort(E,g.e);//采用直接插入排序法对E数组按照权值递增排序for(i=0;i<g.n;i++){vest[i]=i;//初始化辅助数组 } k=1;//表示当前构造的生成树是第几条边,初始为1 j=0;//数组E的下标,初始为0 while(k<g.n){//生成树的边数小于n时,循环u1=E[j].u;v1=E[j].v;//取一条边的两个顶点sn1=vest[u1];sn2=vest[u2];//分别得到两个顶点集合 if(sn1!=sn2) {//两个顶点属于不同集合,该边是最小生成树的一条边 printf("(%d,%d):%d\n",u1,v1,E[j].w);//输出最小生成树的最小一条边 k++;//生成树的边数+1 for(i=0;i<g.n;i++){//两个集合统一编号if(vset[i])==sn2){ //集合编号sn2改为sn1 vset[i]=sn1;}} }j++;//遍历下一条边 }
}

时间复杂度O(eloge) 

三:最短路径Dijkstra算法求单源最短路径问题。

代码:

//set[]:记录已经求得最短路径的顶点
//dist[]:记录从源点v0到其他各顶点当前的最短路径
//path[]:path[i]表示从源点到顶点i之间的最短路径前驱
void dijkstra(MatGraph g,int v,int dist[],int path[]){//已经求得最短路径的顶点被设置成1 int *set=(int*)malloc(sizeof(int)*g.n);//初始化for(int i=0;i<g.n;i++){dis[i]=g.edges[v][i];//初始时直接读取顶点v的边信息//已求得最短路径结点set[i]=0;if(g.edges[v][i]<INF){path[i]=v;//顶点i的直接前驱就是v } else{path[i]=-1;} }set[v]=1;//源点path[v]=-1;for(int i=0;i<g.n;i++){//选取当前最短路径int min=INF;int u=-1;for(int j=0;i<g.n;j++){//只针对还未求得最短路径的顶点if(set[j]==0&&dist[j]<min){u=j;min=dis[j];} } //从v到u的最短路径已经找到了set[u]=1;//用上一步选取的路径去更新最短路径for(int j=0;j<g.n;j++){if(set[j]==0&&dis[u]+g.edges[u][j]<dist[j]){dis[j]=dis[u]+g.edges[u][j];path[j]=u;}}}free(set); 
} //打印路径,从源点到顶点a的最短路径 
void printPath(int path[],int a){//初始化栈int stack[MAX];int top=-1;while(path[a]!=-1){stack[++top]=a;a=path[a];//去到路径的上一个结点 } stack[++top]=a;//单独处理最后一个结点//正序打印路径while(top!=-1){printf("%d ", stack[top--]);} printf("\n");
} 

时间复杂度:求源点到其他顶点O(n^2);求每一对不同顶点之间的最短路径时间复杂度O(n^3);

四:最短路径Floyd算法求多源最短路径问题。

代码:

void floyd(MatGraph g,int path[Max][Max],int dist[Max][Max]){//初始化 for(int i=0;i<g.n;i++){for(int j=0;j<g.n;j++){dis[i][j]=g.edges[i][j];path[i][j]=-1; }}//以顶点k为中间点,完成对所有定点对i,j的更新for(int k=0;k<g.n;k++){for(int i=0;i<g.n;i++){for(int j=0;j<g.n;j++){if(dist[i][j]>dis[i][k]+dis[k][j]){dist[i][j]=dis[i][k]+dis[k][j];path[i][j]=k;}}}} 
}
//输出u到v的最短路径上的顶点序列 
void printpath(int u,int v,int path[Max][Max],int dist[Max][Max]){//u,v不可到达,不输出if(dist[u][v]==INF){return;}if(path[u][v]=-1){printf("(%d,%d)、", u, v);}else{int mind = path[u][v];printpath(u,mid,path,dist);//前半段 printpath(min,c=v,path,dist);//后半段 }
}

时间复杂度O(n^3)

五:拓扑排序。利用邻接矩阵存储。

代码:

//求每个顶点的入度 
int *getIndgree(MatGraph g){int *indegree=(int*)malloc(sizeof(int)*g.n);for(int i=0;i<g.n;i++){//初始化 indegree[i]=0;}//遍历邻接矩阵for(int i=0;i<g.n;i++){for(int j=0;j<g.n;j++){if(g.edges[i][j]!=0){indegree[j]++;//j的入度增加 }}} return indegree; 
} //拓扑排序
bool topSort(MatGraph g){int *indegree=getIndegree(g);//找到一个入度为0的点int stack[MAX];int top=-1;int m=0;//完成拓扑排序的个数 //初始化入度为0的顶点入栈for(int i=0;i<g.n;i++){if(indegree[i]==0){stack[++top]=i;}} while(top!=-1){m++;//完成拓扑排序的个数 //出栈int v=stack[top--];printf("%d,", v);//由该顶点的边到达顶点的入度都减少1。for(int i=0;i<g.n;i++){if(g.edges[v][i]==1){indegree[i]--;if(indegree[i]==0){//入栈stack[++top]; }}}  }free(indegree);return m==g.n;//m= g.n拓扑排序成功,没有环。 m<g.n拓扑排序失败,有环。
} 

时间复杂度O(n^2)

六:拓扑排序。利用邻接表存储。

代码:

int topSort(AdjGraph *G){SqStack *st;InitStack(st);int indegree[MAX];//定义一个入度数组for(int i=0;i<G->n;i++) indegree[i]=0;//初始化入度数组for(int i=0;i<G->n;i++){//求所有顶点入度 ArcNode *p=G->adjlist.firstarc;while(p!=NULL){int w=p->adjvex;indegree[w]++;p=p->nextarc;}} for(int i=0;i<G->n;i++){if(indegree[i]==0){push(st,i);}} int i,n=0;while(!StackEmpth(st)){pop(st,i);//栈不为空时,入栈 n++; printf("%d",i);//输出该顶点 ArcNode *p=G->adjlist[i].firstarc;//寻找第一个邻接点 while(p!=NULL){int w=p->adjvex;indegree[w]--;//入度减1 if(indegree[w]==0){//将入度为0的顶点入栈 push(st,w);}p=p->nextarc;//找下一个邻接点 }}return n=G->n ? 1:0; 
}

时间复杂度O(v+e)

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

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

相关文章

【强化学习的数学原理】第02课-贝尔曼公式-笔记

学习资料&#xff1a;bilibili 西湖大学赵世钰老师的【强化学习的数学原理】课程。链接&#xff1a;强化学习的数学原理 西湖大学 赵世钰 文章目录 一、为什么return重要&#xff1f;如何计算return&#xff1f;二、state value的定义三、Bellman公式的详细推导四、公式向量形式…

006-自定义枚举注解

自定义枚举注解 一、业务需求描述1.问题描述2.解决方案 二、创建一个描述注解三、创建一个枚举注解四、创建一个枚举五、创建一个配置文件六、场景实战1.在 RequestParam 前面使用2.在非 Model 的实体类上使用3.在 RequestBody 对应的实体类中使用 七、效果展示 一、业务需求描…

数据库表设计范式

华子目录 MYSQL库表设计&#xff1a;范式第一范式&#xff08;1NF&#xff09;第二范式&#xff08;2NF&#xff09;第三范式&#xff08;3NF&#xff09;三范式小结巴斯-科德范式&#xff08;BCNF&#xff09;第四范式&#xff08;4NF&#xff09;第五范式&#xff08;5NF&…

力扣刷题--21.合并两个有序链表

I am the best &#xff01;&#xff01;&#xff01; 题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4] 输出&#xff1a;[1,1,2,3,4,4] 示例 2…

【java-Neo4j 5开发入门篇】-最新Java开发Neo4j

系列文章目录 前言 上一篇文章讲解了Neo4j的基本使用&#xff0c;本篇文章对Java操作Neo4j进行入门级别的阐述&#xff0c;方便读者快速上手对Neo4j的开发。 一、开发环境与代码 1.docker 部署Neo4j #这里使用docker部署Neo4j,需要镜像加速的需要自行配置 docker run --name…

三层交换机静态路由实验

1、前置知识 2、实验目的 3、实验器材&#xff1a; 3560-23PS交换机2台、主机4台、交叉线1根和直通网线4根。 4、实验规划及拓扑 实验要求&#xff1a; &#xff08;1&#xff09;在交换机A和交换机B上分别划分基于端口的VLAN&#xff1a; 交换机 VLAN 端口成员 交换机…

基于Java Springboot付费自习室管理系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据…

深度学习笔记24_天气预测

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 一、我的环境 1.语言环境&#xff1a;Python 3.9 2.编译器&#xff1a;Pycharm 3.深度学习环境&#xff1a;TensorFlow 2.10.0 二、GPU设置…

node报错:Error: Cannot find module ‘express‘

报错信息&#xff1a; Error: Cannot find module express 分析原因&#xff1a; 项目中需要express工具&#xff0c;但是import引入不进来&#xff0c;说明在这个项目中我们本没有对express工具包进行install&#xff0c;从我们项目中的package.json也可以看到&#xff08;并…

【课堂笔记】隐私计算实训营第四期:“隐语”可信隐私计算开源框架

“隐语”可信隐私计算开源框架 隐语架构一览隐语架构拆解产品层算法层PSI/PIR数据分析&#xff08;Data Analysis&#xff09;联邦学习&#xff08;Federated Learning&#xff09; 计算层混合编译调度——RayFedSPUHEUTEEUYACL 资源层KUSCIA 互联互通跨域管控 隐语架构一览 隐…

Halo 正式开源: 使用可穿戴设备进行开源健康追踪

在飞速发展的可穿戴技术领域&#xff0c;我们正处于一个十字路口——市场上充斥着各式时尚、功能丰富的设备&#xff0c;声称能够彻底改变我们对健康和健身的方式。 然而&#xff0c;在这些光鲜的外观和营销宣传背后&#xff0c;隐藏着一个令人担忧的现实&#xff1a;大多数这些…

Java项目实战II基于微信小程序的电影院买票选座系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在数字化时代&#xff0c;…

嵌入式中利用QT实现服务器与客户端方法

大家好,今天主要给大家分享一下,如何使用QT中TCP协议进行传输控制,它是一种面向连接的,可靠的基于字节流的传输层控制协议。 第一:Linux中网络通信简介 TCP通信必须建立TCP连接,通信端分为客户端和服务端。服务端通过监听某个端口来监听是否有客户端连接进来,如果有连接…

网络安全,文明上网(6)网安相关法律

列举 1. 《中华人民共和国网络安全法》&#xff1a; - 这是中国网络安全的基本法律&#xff0c;于2017年6月1日开始实施。该法律明确了网络运营者的安全保护义务&#xff0c;包括采取数据分类、重要数据备份和加密等措施。 2. 《中华人民共和国数据安全法》&#xff1a; …

Vscode写markdown快速插入python代码

如图当我按下快捷键CRTLSHIFTK 自动出现python代码片段 配置方法shortcuts’ 打开这个json文件 输入 {"key": "ctrlshiftk","command": "editor.action.insertSnippet","when": "editorTextFocus","args&…

【前端】第12节:Vue3新特性

引入 说起 vue3 的新特性&#xff0c;就会不由自主想到 vue3 和 vue2 之间的差异&#xff0c;例如&#xff1a;双向绑定、根节点数量、生命周期、this 等等&#xff0c;详细可以见这篇文章&#xff08;参考&#xff09;—— vue2和vue3的差异整理&#xff08;轻松过度到vue3&a…

Linux 进程概念与进程状态

目录 1. 冯诺依曼体系结构2. 操作系统&#xff08;Operator System&#xff09;2.1 概念2.2 设计OS的目的2.3 系统调用和库函数概念 3. 进程概念3.1 描述进程 - PCB3.2 task_struct3.3 查看进程3.4 通过系统调用获取进程标识符PID&#xff0c; PPID3.5 通过系统调用创建fork 4.…

滑动窗口篇——如行云流水般的高效解法与智能之道(1)

前言&#xff1a; 上篇我们介绍了双指针算法&#xff0c;并结合具体题目进行了详细的运用讲解。本篇我们将会了解滑动窗口。滑动窗口是一种常用的算法技巧&#xff0c;主要用于处理子数组、子串等具有“窗口”特性的题目。柳暗花明&#xff0c;乃巧解复杂问题的高效之道。 一. …

网络安全-企业环境渗透2-wordpress任意文件读FFmpeg任意文件读

一、 实验名称 企业环境渗透2 二、 实验目的 【实验描述】 操作机的操作系统是kali 进入系统后默认是命令行界面 输入startx命令即可打开图形界面。 所有需要用到的信息和工具都放在了/home/Hack 目录下。 本实验的任务是通过外网的两个主机通过代理渗透到内网的两个主机。…

DB-GPT V0.6.2 版本更新:牵手libro社区、GraphRAG图谱构建能力增强等

DB-GPT V0.6.2版本现已上线&#xff0c;快速预览新特性&#xff1a; 新特性 1、DB-GPT 社区和 libro 社区共同发布 AWEL Notebook 功能 libro&#xff1a;灵活定制、轻松集成的 Notebook 产品方案。 社区地址&#xff1a;https://github.com/difizen/libro 使用教程&#xf…