邻接表是一种数组与链表相结合的存储方式。
用一个数组来存储各个单链表的头指针
无向图的存储:
有向图的存储:
邻接表的创建:
void add(int a,int b)
{
e[idx]=b;
ne[idx]=h[a];
h[a]=idx++;
}
邻接表的遍历:
1.
memset(h,-1,sizeof(h));
for(int i=1;i<=n;i++){
for(int j=h[i];j!=-1;j=ne[j]){
//相关操作
}
}
2.
bool topsort()
{
int hh=0,tt=-1;
for(int i=1;i<=n;i++)
if(!d[i])
q[++tt]=i;//将入度为零的点入队
while(hh<=tt)
{
int t=q[hh++];
for(int i=h[t];i!=-1;i=ne[i])
{
int j=e[i];
d[j]--;//删除点t指向点j的边
if(d[j]==0)//如果点j的入度为零了,就将点j入队
q[++tt]=j;
}
}
return tt==n-1;
//表示如果n个点都入队了话,那么该图为拓扑图,返回true,否则返回false
}