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");
	}
}

运行结果:
C/C++:邻接表实现图的存储(有权值和无权值)

有权值存储:

#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");
	}
}

运行结果:C/C++:邻接表实现图的存储(有权值和无权值)