图存储的三种方式

本文介绍了在IT技术中,邻接矩阵、邻接表以及链式前向星三种图数据结构在稠密图中的使用方法,重点讲解了它们在有向图和无向图中的区别,并提供了C++代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、邻接矩阵

适合稠密图O(V^2)

g[row][col]

对于权值:

(1)有权图:INF表示不存在边、值表示权值

(2)无权图:0表示不存在边,1表示存在边

对于有向图、无向图:

(1)有向图:存一遍

(2)无向图:存两遍g[i][j] = g[j][i]

int g[N][N];
void createGraph1()
{
	for(int i = 0;i < n;i ++)
	{
		int r,c,w;
		cin >> r >> c >> w;
		g[r][c] = w;
	}
}

二、邻接表

给每个顶点都创建一个单链表

用vector实现:

(1)建结构体(起点、终点、权值)

(2)用vector[]存结构体

struct edge{
	int from;  //起点
	int to;  //终点
	int w;  //权值
	edge(int u,int v,int v)
	{
		from = u;
		to = v;
		w = v;
	}
};
vector<edge> e[N];
void createGraph2()
{
	for(int i = 0;i < n;i ++)
	{
		int r,c,w;
		cin >> r >> c >> w;
		e[i].push_back(edge(r,c,w));
	}
}

三、链式前向星

思想与邻接表接近

结构体、head[]

(1)建结构体(终点to、与该起点相同的上一条边编号next、权值w)

(2)head[i]:存以 i 为起点的上一次存的边的编号(和next配合,遍历整个图)

(3)addedge()

struct edge{
	int to;
	int next;
	int w;
};
int head[N];
int cnt;
void init()
{
	for(int i = 0;i < n;i ++) head[i] = -1;  //一开始所有点都不存在边,所以上一条以i为起点的边的编号应该是一个不存在的边编号,设为-1
}
void addedge(int u,int v,int w)
{
	e[cnt].to = v;
	e[cnt].next = head[u];
	head[u] = cnt ++;  //更新以u为起点的上一条存储的边
}
void createGraph3()
{
	for(int i = 0; i< n;i ++)
	{
		int r,c,w;
		cin >> r >> c >> w;
		addedge(r,c,w);
	}
}
for(int i = 0;i < n;i ++)
{
    //只要有更新边
	if(head[i] != -1)
	{
        //head是以该点为起点的最后一条边,next是上一次更新的边
		for(int j = head[i];j != -1;j = e[j].next)
		 cout<<"edge:"<<i<<'-'<<e[j].to<<' '<<e[j].w;
	}
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值