邻接表详解
一.引言
图的基本元素右节点和边构成。而存储图最常用邻接矩阵和邻接表,图通常又分为无向图和有向图。
二.邻接矩阵介绍:
邻接矩阵是一个二维数组 每个点位表示对应坐标节点是否相连。
①数图结合
********邻接矩阵无向图********
v1 | v2 | v3 | v4 | v5 | |
---|---|---|---|---|---|
v1 | 0 | 1 | 0 | 1 | 0 |
v2 | 1 | 0 | 1 | 0 | 1 |
v3 | 0 | 1 | 0 | 1 | 1 |
v4 | 1 | 0 | 1 | 0 | 0 |
v5 | 0 | 1 | 1 | 0 | 0 |
邻接矩阵有向图
由加粗v到v
v1 | v2 | v3 | v4 | v5 | |
---|---|---|---|---|---|
v1 | 0 | 1 | 0 | 1 | 0 |
v2 | 0 | 0 | 0 | 0 | 1 |
v3 | 0 | 1 | 0 | 0 | 0 |
v4 | 0 | 0 | 1 | 0 | 0 |
v5 | 0 | 0 | 1 | 0 | 0 |
②辨析
邻接矩阵在区域节点较多时较为适用,若为稀疏图时则浪费空间,(当边数<顶点数的平方则为稀疏图)
此时采用邻接表较为合适
三.邻接表介绍
①数图结合
②代码解析
存放图:
#include
#include
#include
using namespace std;
typedef struct as{
int point;//存放节点
vector<as*>next;//存放指向的节点
};
int main()
{
int n;cin>>n;
as a[110];
for(int i=0;i<n;i++)a[i].point=i;//记录节点数
int x,y,m;
cin>>m;
for(int k=0;k<m;k++)
{
cin>>x>>y;
a[x].next.push_back(&a[y]);//输入节点关系
}
for(int i=0;i<n;i++)//遍历图
{
cout<<" point "<<a[i].point<<" ";
for(int j=0;j<a[i].next.size();j++)
{
cout<<a[i].next[j]->point<<" ";
}cout<<endl;
}
return 0;
}