·(点的)度:对于无向图,和某个点相连的边条数算法
·入度:对于有向图,终点是该点的边条数数组
·出度:对于有向图,起点是该点的边条数code
·(两点间)路径:从起点点依次沿着边移动到下一个点,直到终点所通过的点和/或边若未有向图要求只能从边的起点移动到边的终点排序
·圈:从一个点出发到本身的路径,经常被称做环队列
·有向无环图(DAG):不含有环的有向图qt
·和数组的排序没什么关系class
·对DAG的顶点进行排序,结果要求top
每一个顶点出现且仅出现一次移动
对于顶点对(u,v),若排序后u在v前,则不存在v到u的路径while
·能够理解为,可以到达某个顶点u的全部点都在u前面出现的一种访问顺序
·通常是随着排序过程处理节点的信息,不须要显式得出结果
·先在建图时记录每一个点的入度
·创建一个队列,把接下来须要访问的点加入队列
·最开始时全部入度为0的点均可以访问,加入队列
·依次从队列中取出每一个点u,枚举其出边,边的终点设为v
·此处进行各类u->v的信息更新
·由于u信息已经计算过了,至关于从图中删去u,将其v入度-1
·此时v若入度为0则说明前置信息处理完成,加入队列
代码:
int ind[MAXN]; int d[MAXN]; int q[MAXN], qhead = 0, qtail = 0; void topo() { for (int i = 1; i <= n; i++) { if (!ind[i]) q[qtail++] = i; } while (qhead != qtail) { int now = q[qhead++]; for (int i = he[now]; i; i = ne[i]) { Edge &e = ed[i]; d[e.to] = max(d[e.to], d[now] + 1); if (!--ind[e.to]) q.push_back(e.to); } } }