数组模拟建立邻接表
第一种方式 纯数组表示
int curEdgeIdx = 0; //新建一条边,为当前边编号
int headNodeToEdge[N],edgeToNode[M],nextEdge[M]; //N顶点数,M边数
memset(headNodeToEdge,-1,sizeof headNodeToEdge); //将数组置1
void add(int a,int b) //在a,b结点之间连接一条边
{ //头插法
edgeToNode[curEdgeIdx] = b; //当前边指向的结点
nextEdge[curEdgeIdx] = headNodeToEdge[a]; //与当前边相邻的下一条边编号
headNodeToEdge[a] = curEdgeIdx ++; //顶点指向的当前边
}
第二种方式 顶点用数组,结点用链表
List[] headNode = new ArrayList[N]; //创建一个N个顶点的数组
for(int i = 0;i < N;;i++){
headNode[i] = new ArrayList<Integer>(); //将每个顶点作为头顶点建立链表
}
//添加一条a到b的边
headNode[a].add(b);