【图论】图论基础-存储

一般有两种存储方式,邻接矩阵和邻接表。

邻接矩阵

使用一个矩阵来存储图,对于矩阵中的一个元素 G u , v G_{u,v} Gu,v
在无权图中, u , v u,v u,v 之间有边为 1 1 1,无边为 0 0 0
在带权图中, u , v u,v u,v 之间有边为 w w w,无边为 inf ⁡ \inf inf

邻接表

使用多个数组来存储图,对于每一个数组 G u G_u Gu
在无权图中, u , v u,v u,v 间有边则加入 v v v
在带权图中, u , v u,v u,v 间有边则加入有序二元组 ( v , w ) (v,w) (v,w)

代码

分为定义,输入和遍历三部分

  • 邻接矩阵
int G[N][N];
memset(G,0,sizeof(G));//无权
memset(G,INF,sizeof(G));//带权
for (int i=1;i<=m;i++){
	//无权
	int u,v;
	cin>>u>>v;
	G[u][v]=1;
	G[v][u]=1;//仅限无向图
	//带权
	int u,v,w;
	cin>>u>>v>>w;
	G[u][v]=w;
	G[v][u]=w;//仅限无向图
}
for (int u=1;u<=n;u++) for (int v=1;v<=n;v++)
	if (G[u][v])//无权
	if (G{u][v]!=INF)//带权
  • 邻接表
vector<int> G[N];//无权
//带权
struct edge{int v,w;};
vector<edge> G[N];
for (int i=1;i<=m;i++){
	//无权
	int u,v;
	cin>>u>>v;
	G[u].push_back(v);
	G[v].push_back(u);//仅限无向图
	//带权
	int u,v,w;
	cin>>u>>v>>w;
	G[u].push_back({v,w});
	G[v].push_back({u,w});//仅限无向图
}
for (int u=1;u<=n;u++)
	for (int v:G[u])//无权
	for (edge e:G[u])//带权
上一篇:AC自动机


下一篇:JAVA爬虫基础