邻接表建图的三种方式的时空比较(解析+图示)

简介:

邻接表建图法1
极大的节省了空间和时间 是建图非常棒的一种方式
它利用数组模拟出边与边之间的关系  

图示解析(数据为代码中的测试数据):

复制代码
复制代码
1 #include<iostream>
2  #define Maxn 200
3  usingnamespace std;
4  struct edge{int from,to,weight,next;}e[Maxn];//存储边信息的结构体 
5 int first[Maxn];//起点为下标存储(e中边的位置) 
6 int main()
7 {
8 int edges;//边数 
9 memset(first,-1,sizeof(first));
10 //因为刚开始first不指向任何一条边的下标,所以first都为-1 
11 cin>>edges;//边数 
12 for(int i=0;i<edges;i++)
13 {
14 cin>>e[i].from>>e[i].to>>e[i].weight;//起点 终点 权重 
15 e[i].next=first[e[i].from];first[e[i].from]=i;//不容易理解的地方
16 /*
17 利用first数组存储的是最新的(以数组下标为起点的)边的下标 
18 并且该条边的next指向的是同样以数组下标为起点的下一条边的下标 
19 直到下一条边的next=-1(即将所有以数组下标为起点的边都遍历了一遍) 
20 */
21 }
22 for(int u=1;u<10;u++)//输出图 
23 {
24 cout<<"以"<<u<<"为起点的所有边的信息:"<<endl; 
25 for(int v=first[u];v!=-1;v=e[v].next)//遍历以u为起点的所有边的信息 
26 cout<<e[v].from<<""<<e[v].to<<""<<e[v].weight<<endl;
27 }
28 return0;
29 }
30 /*
31 5
32 3 4 6
33 3 7 8
34 1 3 6
35 2 4 7
36 3 5 1
37 */
复制代码
复制代码

邻接表建图法2
这种方式与上一种方式出自一个思想 
只不过是前者是利用数组模拟边之间的关系
而它是用指针来表示边之间的关系 

复制代码
复制代码
1 #include<iostream>
2 #define Maxn 200
3 usingnamespace std;
4 struct edge
5 {
6 int from,to,weight;
7 edge *next;
8 }e[Maxn];//存储边 
9 edge*first[Maxn];//所有以起点为下标的头指针
10 int main()
11 {
12 int edges;//边数 
13 for(int i=0;i<Maxn;i++)first[i]=NULL;
14 //因为刚开始first不指向任何一条边,所以初始化first都为NULL 
15 cin>>edges;//边数 
16 for(int i=0;i<edges;i++)
17 {
18 cin>>e[i].from>>e[i].to>>e[i].weight;//起点 终点 权重 
19 e[i].next=first[e[i].from];first[e[i].from]=&e[i];//不容易理解的地方
20 /*
21 利用first数组存储的是最新的(以数组下标为起点的)边的地址 
22 并且该条边的next指向的是同样以数组下标为起点的下一条边的地址 
23 直到下一条边的next=NULL(即将所有以数组下标为起点的边都遍历了一遍) 
24 */
25 }
26 for(int u=1;u<10;u++)//输出图 
27 {
28 cout<<"以"<<u<<"为起点的所有边的信息:"<<endl; 
29 for(edge*v=first[u];v;v=v->next)//遍历所有以u为起点的边 
30 cout<<v->from<<""<<v->to<<""<<v->weight<<endl;
31 }
32 return0;
33 }
复制代码
复制代码

邻接表建图3 
这种方式十分精巧,适合表明点之间的关联关系,并且可以统计出以某一点为起点的边的总数
但不能够存储权重,如果数据量比较大时,浪费的空间非常大 

复制代码
复制代码
1 #include<iostream>
2 #define Maxn 200
3 usingnamespace std;
4 int main()
5 {
6 int G[Maxn][Maxn],edges,from;
7 for(int u=1;u<Maxn;u++)G[u][0]=0; //G[u][0]用于记录起点为u的边的总数 
8 cin>>edges;//边数 
9 while(edges--)
10 cin>>from>>G[from][++G[from][0]];//起点 终点 
11 for(int u=1;u<10;u++)//输出图 
12 {
13 cout<<"所有以"<<u<<"为起点的边共有"<<G[u][0]<<"条分别为: "<<endl; 
14 for(int v=1;v<=G[u][0];v++)//输出所有以u为起点的边的信息 
15 cout<<G[u][v]<<"";
16 cout<<"\n";
17 }
18 return0;
19 }
复制代码
复制代码

Author:银志圆

相关文章
|
Cloud Native 区块链 云计算
穿越时空的创新:解析云原生与Web3.0的奇妙渊源
穿越时空的创新:解析云原生与Web3.0的奇妙渊源
212 0
|
算法 大数据 定位技术
2016大数据创新大赛——机场客流量的时空分布预测模型解析
在大数据创新大赛上,来自浙江大学的SeaSide团队带来了关于机场客流量的时空分布预测的解决方案。SeaSide团队主要从时序模型、乘机流程、事件驱动、维度灾难四个方面介绍了团队的算法设计。
9712 0
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
343 2
|
8月前
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
818 29
|
8月前
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
322 4
|
8月前
|
JavaScript 算法 前端开发
JS数组操作方法全景图,全网最全构建完整知识网络!js数组操作方法全集(实现筛选转换、随机排序洗牌算法、复杂数据处理统计等情景详解,附大量源码和易错点解析)
这些方法提供了对数组的全面操作,包括搜索、遍历、转换和聚合等。通过分为原地操作方法、非原地操作方法和其他方法便于您理解和记忆,并熟悉他们各自的使用方法与使用范围。详细的案例与进阶使用,方便您理解数组操作的底层原理。链式调用的几个案例,让您玩转数组操作。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
8月前
|
移动开发 前端开发 JavaScript
从入门到精通:H5游戏源码开发技术全解析与未来趋势洞察
H5游戏凭借其跨平台、易传播和开发成本低的优势,近年来发展迅猛。接下来,让我们深入了解 H5 游戏源码开发的技术教程以及未来的发展趋势。
|
8月前
|
存储 前端开发 JavaScript
在线教育网课系统源码开发指南:功能设计与技术实现深度解析
在线教育网课系统是近年来发展迅猛的教育形式的核心载体,具备用户管理、课程管理、教学互动、学习评估等功能。本文从功能和技术两方面解析其源码开发,涵盖前端(HTML5、CSS3、JavaScript等)、后端(Java、Python等)、流媒体及云计算技术,并强调安全性、稳定性和用户体验的重要性。
|
9月前
|
机器学习/深度学习 自然语言处理 算法
生成式 AI 大语言模型(LLMs)核心算法及源码解析:预训练篇
生成式 AI 大语言模型(LLMs)核心算法及源码解析:预训练篇
2289 1
|
8月前
|
负载均衡 JavaScript 前端开发
分片上传技术全解析:原理、优势与应用(含简单实现源码)
分片上传通过将大文件分割成多个小的片段或块,然后并行或顺序地上传这些片段,从而提高上传效率和可靠性,特别适用于大文件的上传场景,尤其是在网络环境不佳时,分片上传能有效提高上传体验。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

推荐镜像

更多
  • DNS
  • 下一篇
    oss云网关配置