表示图的一种简单的方法是使用一个二维数组,成为邻接矩阵表示法,对于每条边(u,v),我们置A[u][v] = 1,否则,数组元素就是0。如果边有一个权,那么我们可以置A[u][v]等于该权,而使用一个很大或者很小的权作为标记表示不存在的边。邻接矩阵的表示法无论是在理解还是写法上都很简单,但是空间需求为O(|V|^2),如果图的边不是很多,那么这种表示方法的代价就太大。一般的,对于稠密图,我们使用邻接矩阵表示法,而更为通用的则是用邻接表表示,邻接表的空间需求仅为O(|E|+|V|).
对于每一个点,把与之相邻的点记录下来,如图9-2所示,编号1所对应的2、4、3(顺序不唯一)即为其相邻的点。
代码实现
struct Edge{
int u,v,w,next;
};
int head[MAX];
memset(head,-1,sizeof(head));
for (int i = 0; i < 2*M; i+=2)
{
scanf("%d%d%d",&u,&v,&w);
edge[i].u = u;
edge[i].v = v;
edge[i].w = w;
edge[i].next = head[u];
head[u] = i;
edge[i+1].u = v;
edge[i+1].v = u;
edge[i+1].w = w;
edge[i+1].next = head[v];
head[v] = i+1;
}
建立结构体,存取点的信息,u为当前点,v为与u相邻的点,w为u,v之间边的权值;
head[]数组初始化为-1,head[x],x的含义表示的就是点,例如head[1]就是1这个点,head[1]的值则记录下关于1这个点的邻接表的位置,类似于链表的头节点。
另外,代码中给出的是无向图邻接表的建立。