邻接表
邻接表的介绍完全可以参考数据结构之图(三)——邻接表这篇博客的介绍,在此不做赘述。
代码实现
实现邻接表最关键的就是需要存储链表。其实完全可以使用vector实现。下面我将介绍手写的邻接表实现方式。
定义结构
typedef struct ArcNode{
// 边表指针
int adjvex;
struct ArcNode *next;
int weight; // 边权
ArcNode():adjvex(-1), next(NULL), weight(-1){
}
ArcNode(int a, ArcNode* b, int w): adjvex(a), next(b), weight(w) {
}
} ArcNode;
typedef struct VNode {
// 顶点表指针
int data;
ArcNode *first = NULL; // 指向顶点的下一个
ArcNode *last = NULL; // 指向边表的最后一个
VNode() {
}
VNode(int data): data(data), first(NULL), last(NULL) {
}
} vNode;
typedef struct {
int vexNum = 0, arcNum = 0;
vector<VNode> vertices;
} ALGraph;
构造邻接表
注意传入的参数是二维数组 e d g e s edges edges,其中 e d g e s [ i ] = { x i , y i , w i } edges[i] = \{ {x_i, y_i, w_i}\} edges[i]={ xi,yi,wi}, x i , y i x_i, y_i xi,yi指的是边的两顶点, w i w_i wi指的是两顶点的边权。以下代码构造的是无向图,有向图只需要做相应的修改即可。
ALGraph makeGraph(vector<vector<int>> edges) {
ALGraph g;
int n = edges.size();
g.arcNum = n * 2;
for (int i = 0; i < n; ++i) {
if (edges[i][0] > edges[i][1]) swap(edges[i][0], edges[i][1]);
g.vexNum = max(g.vexNum, edges[i][1]);
}
g.vertices.resize(g.vexNum);
for (int i = 1; i