关于链式前向星的拓扑排序的简单笔记

(简要笔记,仅供参考,可能存在瑕疵或者不正确的地方,望指正)

1简单概念

(1)将有向无环图进行排序,若存在环就无法排序。

(2)假设有两个点1和2,1->2,那么排序后不会出现2->1,。

2方法
(1)寻找入度为0的点,如果存在多个,任意取一个,加入队列。

(2)删去选取的点,并将它发出的边删除,那么被该点指向的点入度将减一。

(3)重复,直到对列为0。

3组成(1)

struct node{
int to;//终点
int w;//权值
int next //上一条边的编号
}edge[N];

(2)int head[N];//以该点为起点的上一条边的编号,作为遍历的起点;

 head[n]初始化为0(这里tot不是从0开始编号,如果tot从0开始,head初始化为-1)。

(3)int tot//编号(初始化为0);

(4)int indegree[N]//每个点的入度。(有多少路径以这个点为终点)

(5)add函数

void add(int x,int y,int z)//用于加边的函数,x为起点,y为终点,z为权值。
{tot++;
indgree[y]++;
edge[tot].to=y;
edge[tot].w=z;
edge[tot].next=head[x];
head[x]=tot;
}

(6)queueq//用于存储入度为0的队列。

(6)拓扑排序函数

bool toposort(){
int count=0;       //记录排好序的点的数量。
for(int i=0;i

你可能感兴趣的:(acm算法学习笔记,排序算法,数据结构,拓扑学)