邻接矩阵
int G[MAXN][MAXN]; //MAXN为点的数目
memset(G, 0x3f3f3f3f, sizeof(G)); //适合求最短路等
memset(G, 0, sizeof(G)); //适合传递闭包
适合多源最短路Foyed、求图的传递闭包等。
数组邻接表
struct Edge {
int fr, to, pw, ne; //分别为边的起点、终点、边权、上一条相同起点的边
Edge(int fr = 0, int to = 0, int pw = 0, int ne = 0) :
fr(fr), to(to), pw(pw), ne(ne) {}
} edge[MAXM]; //MAXM为边的数目
int head[MAXN]; //MAXN为点的数目,head数组记录每个点的最后一条边。
int sume; //sume为总的边数。
void addEdge(int x, int y, int z) {
edge[++sume] = Edge(x, y, z, head[x]);
head[x] = sume;
}
for (int u = head[x]; u; u = edge[u].ne) {
//搜索...
}
比较费空间,但是比较好理解。
容易进行DFS,BFS,求各种图论问题等。
指针邻接链表
struct Node {
struct Edge *fe;
//各种变量(vis,dis之类—)
} node[MAXN];
struct Edge {
Node *fr, *to;
Edge *ne;
Edge(Node *const fr, Node *const to, int pw) :
fr(fr), to(to), pw(pw), ne(fr->fe) {}
};
void addEdge(const int &x, const int &y, const int &z) {
node.fe = new Edge(&node[x], &node[y], z);
}
for (Edge *e = x->fe; e; e = e->ne) {
//搜索...
}
//省空间而且比较简洁。