C++ 邻接矩阵与链式前向星

本文介绍了C++中图的两种常见存储方式——邻接矩阵和链式前向星。邻接矩阵适用于稠密图,空间效率在数据较小或使用Floyd算法时较高,但可能会占用大量空间。链式前向星是一种更节省空间的存储方法,特别适合稀疏图,其结构包含多个链表,通过表头数组快速定位数据。

目录:

边的存储方法

邻接矩阵

链式前向星简介


边的存储方法:

        边的存储方法有:邻接矩阵,邻接表,数组模拟邻接表,链式前向星……

        当前主流的存储方法是:邻接矩阵 和 链式前向星

邻接矩阵:

        基本思想:用一个一维数组存储图中顶点的信息,用一个二维数组(称为邻接矩阵)存储图中各顶点之间的邻接关系。

        在 数据较小 或 用 Floyd算法 时,常用邻接矩阵,邻接矩阵在稠密图中表现得效率尤为高。

        无向图的邻接矩阵一定是对称的,而有向图的邻接矩阵不一定对称。

        邻接矩阵虽然简单,但是,邻接矩阵所需要的空间大小为n^{2},很多情况下时会爆空间的。

        给大家一张图:

【代码实现】

//假设有n个点,m条边,求1~n的最短路径
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<map>
#include<vector>
#include<string>
#include<cstring>
#include<queue>//头文件 
int n,m;
int mapp[1001][1001];//存储图中的边权 
int dian[1001];//存储途中点的信息 
void clean()//初始化 
{
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			if(i==j)
			{
				mapp[i][j]=0;
			}
			else
			{
				mapp[i][j]=0x7f7f7f;
				//mapp[i][j]=- 0x7f7f7f;
				//初始为无穷大或无穷小,需要根据题目变通 
			}
		}
	}
	return;
}
int main()
{
	scanf("%d%d",&n,&m);
	clean();//初始化
	for(int i=1;i<=n;i++)//读入点的信息,有些题目可能不需要读入点的信息 
	{
		scanf("%d",&dian[i]);
	} 
	for(int i=1;i<=m;i++)//读入边的信息 
	{
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		mapp[u][v]=w;//有向图 
		//mapp[u][v]=mapp[v][u]=w;无向图 
	}
} 

 

链式前向星简介:

        链式前向星是一种特殊的存储边的方式。链式前向星可以看作 " 带有索引数组的多个数据结构 " 构成的集合。在这样的结构中,存储的数据被分成若干类,每一类的数据结构构成一个链表,每一类还有一个代表元素,称为该类链表的 " 表头 " 。所有的 " 表头 " 构成一个表头数组,作为一个可以随机访问的索引,从而可以通过表头的数组定位到某一数据的对应的链表。

        相对于邻接矩阵,链式前向星的应用范围更广。

        给大家一张图:

【代码实现】

  

//假设有n个点,m条边 
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<map>
#include<vector>
#include<string>
#include<cstring>
#include<queue>//头文件 
using namespace std;
int n,m;
int tot;//累加边数 
struct node
{
    int from;
	int to;
	int w;
}mapp[10001];
int head[10001];//记录头节点 
void add(int u,int v,int w)//链式前向星存储边权 
{
	tot++;//边数累加
    head[u]=tot;
    mapp[tot].from=head[u];
    mapp[tot].to=v;
    mapp[tot].w=w;
    return;
}
int main()
{
	scanf("%d%d",&n,&m);//读入 
	for(int i=1;i<=m;i++)
	{
		int u,v,w;
		scanf("%d%d%d",&u,&v,&w);
		add(u,v,w);//有向图 
		//add(u,v,w);//无向图 
		//add(v,u,w);//无向图 
	}
	return 0; 
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值