一、矩阵
二、邻接表
1. 自己写
//图的邻接表存储
struct Lnode{
int next; //指向的点
int pre; //指入的点
int w; //边的权
}
2. C++ vector
如果题目给定若干的边[i,j],表示从i->j 有一条边,那么可以将这些边用二维数组存储,转化成图。
有向图:
//题目给定的边表
vector<vector<int>> edges={{1,2},{1,3},{1,5},{2,1},{2,5},{3,4},{5,2},{5,4}};
//可以看出这是一个有向图,而且有两条边是双向的1<->2和2<->5
//有向图的储存:用一个二维数组式的邻接表储存
//指出的边表
vector<vector<int>> graph_out;
for(auto edge:edges){
graph_out[edge[0]].push_back(edge[1]);
}
//指入的边表
vector<vector<int>> graph_in;
for(auto edge:edges){
graph_in[edge[1]].push_back(edge[0]);
}
//其中edge是一维数组,表示edges里的一条边,for循环是对edges的所有边edge都进行这样的操作。
//egde[0]:一条边的第一个数,即指出的结点。
//edge[1]:指入的结点
//graph[edge[0]]:指出的结点的行
//graph[edge[0]].push_back(edge[1]):用graph[i]这一行指指出结点,graph[i][j]指指出结点指向的结点有哪些。
无向图
//无向图的存储
vector<vector<int>> graph;
for(auto edge:edges){
graph[edge[0]].push_back(edge[1]);
graph[edge[1]].push_back(edge[0]);
}
复杂度:
由于邻接表只储存了连接的边的信息,所以其空间复杂度为Θ(m) (m:边数),这相对于矩阵存图的 O(n^2) 复杂度是一个很大优化。
三、链式前向星