C/C++:邻接表实现图的存储(有权值和无权值)
邻接表存储图可以使用vector容器来实现,方便且简单,如果是有权图,用结构体将信息串起来
无权值存储:
#include <cstdio>
#include <vector>
using namespace std;
#define MAX 100
vector<int> Adj[MAX];//MAX为顶点个数,没有边权
void PrintAdj(int n);
int main() {
Adj[0].push_back(1);
Adj[0].push_back(3);
Adj[0].push_back(4);
Adj[0].push_back(7);
Adj[2].push_back(1);
Adj[2].push_back(5);
Adj[2].push_back(0);
PrintAdj(3);
return 0;
}
void PrintAdj(int n) {
for(int i = 0; i < n; i++) {
printf("顶点%d:", i);
for(int j = 0; j < Adj[i].size(); j++) {
printf("%d ", Adj[i][j]);
}
printf("\n");
}
}
运行结果:
有权值存储:
#include <bits/stdc++.h>
using namespace std;
struct Node { //到达顶点v,边权为w
int v;
int w;
Node(int int_v, int int_w) {
v = int_v;
w = int_w;
}
};
#define MAX 100
vector<Node> Adj[MAX];//MAX为顶点个数,没有边权
void PrintAdj(int n);
int main() {
Adj[1].push_back(Node(3, 13));
Adj[2].push_back(Node(3, 23));
Adj[3].push_back(Node(2, 32));
Adj[3].push_back(Node(1, 31));
PrintAdj(3);
return 0;
}
void PrintAdj(int n) {
for(int i = 1; i <= n; i++) {
printf("顶点%d:", i);
for(int j = 0; j < Adj[i].size(); j++) {
printf("(%d %d %d) ", i, Adj[i][j].v, Adj[i][j].w);
}
if(i != n)printf("\n");
}
}
运行结果: