在ACM比赛中,邻接表往往不是用类实现的,而是用数组模拟的。下面举个例子:
首先建立三个数组:head[N],next[E],adj[E],vv[E]。
head[N]数组存储顶点表,adj[E]存储边表顶点,还有next[E]存储边表的结点的下一个。
假如数据输入为: (为了方便描述,v0结点用1表示,v1结点用2表示——以此类推)
a b W
1 2 1
1 4 2
2 1 3
2 3 4
4 3 5
4 5 6
5 2 7
C++描述:
num=1;
memset(head,0,sizeof(head));
memset(next,0,sizeof(next));
memset(adj,0,sizeof(adj));
void init(int a ,int b,int w)
{
next【num】=head【a】;//一开始的NEXT[N]都是等于0,
//如果这个head【a】等于0的话(意味着这个顶点还没延伸出边)
//把这几个数组看成指针会好理解很多
head【a】=num;
adj【num】=b;
vv【num】=w;
num++;
}
总结:head数组总是记录着该头结点最迟加入的边结点的下标,然后通过这个边结点的next数组找到该头结点的下一个边结点,直到遍历结束(碰到0)
next数组和adj数组总是和边数的编号一致的。