存图方式【知识点】

2024-04-10 18:38
文章标签 知识点 方式 存图

本文主要是介绍存图方式【知识点】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

邻接矩阵


我们定义一个数组a[MAXN][MAXN]; 那么存图方式就是:
a[i][j]=val;
对于无向图,就代表i和j之间有一条权值为val的边,如果是
无权图,val=1。
对于有向图,就代表i->j(j->i你不清楚)有一条权值
为val的边,无权图的话val=1。
这样我们就能够用这样一个矩阵实现了图的存放,但是,如果点
的数量过大了怎么办呢?二维数组可是开不了很大的啊。比如
有50000个点。那么二位数组就存放不下了,那么我们就要借助
邻接表法了。

邻接表法


大家在前期的时候学STL的时候学过vector,而邻接表就是
用vector来进行存放的
代码实现(以无向图为例)
vector <int > e[ MAXN ]; // edge
vector <int > v[ MAXN ]; // val
cin >>a>>b>>c;
e[a]. push_back (b);
v[a]. push_back (c);
e[b]. push_back (a);
v[b]. push_back (c);

 

 

前向星.

 

前向星是一种特殊的边集数组,我们把边集数组中的每一条边按照起点从小到大排序,如果起点相同就按照终点从小到大排序,

并记录下以某个点为起点的所有边在数组中的起始位置和存储长度,那么前向星就构造好了.

 

用len[i]来记录所有以i为起点的边在数组中的存储长度.

用head[i]记录以i为边集在数组中的第一个存储位置.

 

那么对于下图:

 

 

 

我们输入边的顺序为:

 

1 2

2 3

3 4

1 3

4 1

1 5

4 5

 

那么排完序后就得到:

 

编号:     1      2      3      4      5      6      7

起点u:    1      1      1      2      3      4      4

终点v:    2      3      5      3      4      1      5

 

得到:

 

head[1] = 1    len[1] = 3

head[2] = 4    len[2] = 1

head[3] = 5    len[3] = 1

head[4] = 6    len[4] = 2

 

但是利用前向星会有排序操作,如果用快排时间至少为O(nlog(n))

链式前向星

我们用head[i]表示以i为起点的最后一条边的储存位置,
next[i]表示与第i条边同起点的上一条边的储存位置,e[i]表
示第i条边的终点。

 

 

我们输入边的顺序为:

 

1 2

2 3

3 4

1 3

4 1

1 5

4 5

加边
struct Edge
{
int next ;
int e;
int w;
} edge [ MAXN ];edge[i].next表示同起点的上一条边,edge[i].e代表这条边的终点,
edge[i].w为权值。void add (int u,int v,int w)
{
edge [cnt ].w = w;
edge [cnt ]. to = v;
edge [cnt ]. next = head [u];
head [u] = cnt ++;
}
cnt初始化为0,head初始化为-1。
边的遍历,遍历以u为起点的所有边
for (int i= head [u];~i;i= edge [i]. next )
{
cout <<u<<" ->" <<edge [i].e<< endl ;
}
倒序遍历
#include<bits/stdc++.h>
using namespace std;
#define MAXN 10050
struct EDGE
{int w;//权值 int next;//与该边同起点的上一条边的位置 int e;//边的终点 
}edge[MAXN];
int cnt; 
int head[MAXN];//以i为起点的最后一条边
void add(int u,int v,int w)
{edge[cnt].w=w;edge[cnt].e=v;edge[cnt].next=head[u];head[u]=cnt++;
} int main()
{memset(head,0,sizeof(head));cnt=1;int n,a,b,c;cin>>n;for(int i=1;i<=n;i++){cin>>a>>b>>c;add(a,b,c);}int start;cin>>start;for(int i=head[start];i!=0;i=edge[i].next){cout<<start<<"->"<<edge[i].e<<" "<<edge[i].w<<endl;}return 0;
}

 

这篇关于存图方式【知识点】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/891830

相关文章

Debezium 与 Apache Kafka 的集成方式步骤详解

《Debezium与ApacheKafka的集成方式步骤详解》本文详细介绍了如何将Debezium与ApacheKafka集成,包括集成概述、步骤、注意事项等,通过KafkaConnect,D... 目录一、集成概述二、集成步骤1. 准备 Kafka 环境2. 配置 Kafka Connect3. 安装 D

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

JS 实现复制到剪贴板的几种方式小结

《JS实现复制到剪贴板的几种方式小结》本文主要介绍了JS实现复制到剪贴板的几种方式小结,包括ClipboardAPI和document.execCommand这两种方法,具有一定的参考价值,感兴趣的... 目录一、Clipboard API相关属性方法二、document.execCommand优点:缺点:

Python创建Excel的4种方式小结

《Python创建Excel的4种方式小结》这篇文章主要为大家详细介绍了Python中创建Excel的4种常见方式,文中的示例代码简洁易懂,具有一定的参考价值,感兴趣的小伙伴可以学习一下... 目录库的安装代码1——pandas代码2——openpyxl代码3——xlsxwriterwww.cppcns.c

Deepseek使用指南与提问优化策略方式

《Deepseek使用指南与提问优化策略方式》本文介绍了DeepSeek语义搜索引擎的核心功能、集成方法及优化提问策略,通过自然语言处理和机器学习提供精准搜索结果,适用于智能客服、知识库检索等领域... 目录序言1. DeepSeek 概述2. DeepSeek 的集成与使用2.1 DeepSeek API

CSS弹性布局常用设置方式

《CSS弹性布局常用设置方式》文章总结了CSS布局与样式的常用属性和技巧,包括视口单位、弹性盒子布局、浮动元素、背景和边框样式、文本和阴影效果、溢出隐藏、定位以及背景渐变等,通过这些技巧,可以实现复杂... 一、单位元素vm 1vm 为视口的1%vh 视口高的1%vmin 参照长边vmax 参照长边re