一、介绍
- 邻接表的思想是,对于图中的每一个顶点,用一个数组来记录这个点和哪些点相连。由于相邻的点会动态的添加,所以对于每个点,我们需要用vector来记录。
二、邻接表(vector实现)
5 8
0 1
0 2
2 1
1 3
3 0
3 2
3 4
4 3
#include <cstdio>
#include <vector>
using namespace std;
int main() {
vector<int> g[100];
int n, m;
scanf("%d%d", &n, &m);
int u, v;
for (int i = 0; i < m; i++) {
scanf("%d%d", &u, &v);
//添加u-->v
g[u].push_back(v);
}
//进行输出
for (int i = 0; i < n; i++) {
printf("%d :", i);
for (int j = 0; j < g[i].size(); j++) {
printf("%d ", g[i][j]);
}
printf("\n");
}
return 0;
}
三、邻接链表(数组模拟链表实现)
- 添加边:
代码实现:
#include <cstdio>
const int N = 1005;
int head[N]; //表示有多少个点
int len = 1; //表示有多少个节点
struct edge {
int v, w, next;
}e[N * 2]; //保存节点信息
//添加u--->v 这条边
void add(int u, int v, int w) {
e[len].v = v;
e[len].w = w;
e[len].next = head[u];
head[u] = len; //头节点指向这个节点编号
len++; //下个一节点开辟
}
int main() {
int n, m;
scanf("%d%d", &n, &m);
int u, v, w;
for (int i = 0; i < m; i++) {
scanf("%d%d%d", &u, &v, &w);
//添加u-->v
add(u, v, w);
}
//进行输出
for (int i = 0; i < n; i++) {
printf("%d :", i);
for (int j = head[i]; j != 0; j = e[j].next) {
printf("%d(%d) ", e[j].v, e[j].w);
}
printf("\n");
}
return 0;
}