因为在图论中总会遇到存图的情况,如果用邻接矩阵进行存储,相当于需要开辟 点 的平方的空间,但采用邻接表,有多少条边开辟多少空间,更节省空间。
两种表达方式:
- 用
t
o
p
=
0
top=0
top=0 存第一条边,边的个数范围为
[
0
,
m
?
1
]
[0,m-1]
[0,m?1]
此时需要把头数组初始化为-1,memset(head,-1,sizeof(head) 且在对某一点进行枚举边时(看该点与哪些点相连),应该写成for(int j=head[i];~j;j=edge[i].next 代表若下一条边的头是-1退出,没有边了。 - 用
t
o
p
=
1
top=1
top=1 存第一条边,边的个数范围为
[
1
,
m
]
[1,m]
[1,m]
此时需要把头数组初始化为0,memset(head,0,sizeof(head) 且在对某一点进行枚举边时(看该点与哪些点相连),应该写成for(int j=head[i];j;j=edge[i].next 代表若下一条边的头是0退出,没有边了。
在代码中呈现:
#include<bits/stdc++.h>
using namespace std;
const int maxn=105;
struct node{
int to,next;
int val;
}edge[maxn];
int head[maxn],top;
int n,m;
void init(){
memset(head,-1,sizeof(head));
top=0;
}
void add(int u,int v,int w){
edge[top].to=v;
edge[top].next=head[u];
edge[top].val=w;
head[u]=top++;
}
int main(){
init();
cin>>n>>m;
for(int i=1;i<=m;i++){
int x,y,w;
cin>>x>>y>>w;
add(x,y,w);
add(y,x,w);
}
for(int i=1;i<=n;i++){
for(int j=head[i];~j;j=edge[j].next){
int d=edge[j].to;
}
}
return 0;
}
总结:邻接表的存储是以边为基础,会存每个点通过编号(top)的边与点(edge[j].to)相连。已知点u,就可以通过邻接表得到与u点连接的所有点,也可以得到两点间的边权。
|