图的几种存储结构与方法(有向图+无向图)

图的几种存储结构:

1、邻接矩阵

2、链式前向星

3、C++中vector的邻接表

(一)邻接矩阵

邻接矩阵是表示顶点之间相邻关系的矩阵。

基本思想为:

S [ i ] [ j ] S[i][j] S[i][j] 就可以表示i ->(到) j有一条边内部数值可以是边权或者bool标记有无

上部为无向,下部为有向

建图什么的不就有手!!就行!!

使用实际或优劣对比:

1、方便检查任意一对定点间是否存在边

2、方便找任一顶点的所有“邻接点”(有边直接相连的顶点)

3、方便计算任一顶点的度(你遍历就完了)

对于无向图,邻接矩阵的第i行(或第i列)非零元素(或非∞元素)的个数正好是第i个顶点的度。

对于有向图,邻接矩阵的第i行(或第i列)非零元素(或非∞元素)的个数正好是第i个顶点的出度(或入度)。

for(int i=1;i<=?;i++)if(a[i][j]!=0)du[i]++;

那么劣势是啥子嘞???时空关系恐惧症!!!!

(二)链式前向星

链表的话就是可以放很多东西嘛,理解的话稍微难度大一点

1、结构安排
struct edge{
	int to;//  边是有向的,指向一个点 
	int next; //   锚定一个结点上的所有边,这个最难理解 
	int w;  //边权,可有可无 
};
2、增边
int head[MAXN];  //记录这个点上现有最后一条边的num 
int cnt;//全局,记录边的序号和个数,对于边的锚定也很重要 
void  add(int from ,int to ,int w)
{
	e[++cnt].next=head[from];
	e[cnt].to=to;
	e[cnt].w =w;
	head[from]=cnt;
 } 

此处我们cnt=0,必须先自增;

3、锚定(这个蛮难的,姬某断断续续搞的差不多,真的绝绝子)

head[cnt]
记录了当前的节点的最后一条边,也是遍历的起点

每个节点第一边next=0;第二边指向第一边————最后head[点序号]指向第N边,N找到N-1(如此往复)最终到1;

(三)vector

vector就是(一)和(二)的结合,会有压边那种struct进去的直接二维vector

简单来一下二维vector就是动态了一下子,思想没变的,把from抽离出来就好了;

1、建立
struct edge{
	int to;//  边是有向的,指向一个点 
	int w;  //边权,可有可无 
}e;

vector<edge>vec[MAXN];

void  add(int from ,int to ,int w)
{
	e.to=to;e.w=w;  //借助中间变量暂时存一下
	vec[from].push_back(e);  //从from出发的边压了一条进去;
} 


2、遍历
for(int i=1;i<=节点数;++i)
{
	for (int j=0;j<vec[i].size();++j){
        	e=vec[i][j];  //借助中间量抽出我们的目的 
			cout<<"从 "<<i<<" 到 "<<e.to<<" 的值为 "<<e.value<<endl;
	} 
}

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流苏贺风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值