const int N = 100010, M = N*2;
int h[N];//邻接表,h[3]表示结点3的第一个邻接点的下标(地址)
int e[M];//存储边的信息,邻接表中所有的边都放到该数组中,e[5]表示地址为5的邻接点的编号
int ne[M];//存储next指针,ne[3]表示e[3]的下一个结点的下标,如同结构体数组表示邻接表中的next指针
int idx;//类似于工作指针p,值为当前指向结点的下标(地址)
void add(int a,int b){//建立一条从a到b的有向边
e[idx]=b;//将b存储在边集中
ne[idx]=h[a];//头插法,将b结点的next指向a原来的第一个邻接点,相当于将b插入到a和a的别的邻接点中
h[a]=idx++;//头插法,h[a]指向b,然后工作指针idx++
}