图的拓扑排序

图的基本算法-拓扑序列

  • 拓扑排序
    • 拓扑排序基本算法
    • 代码示例

拓扑排序

对于一个有向无环图,简称DAG(Directed Acyclic Graph),进行拓扑排序就是将图中所有的定点排成一个线性序列,使得图中任意一对定点u和v,若边则u在拓扑排序中出现在v之前。这样的序列成为满足拓扑次序的序列成为拓扑排序。

拓扑排序基本算法

对于一个有向无环图:

  • 找到入度为0的顶点,可能有多个,选取其中一个,输出该顶点后,将与该顶点相关的所有有向边删除,即该顶点出度减1,且与该顶点相连的所有有向边的另一个顶点的入度减1。
  • 重新扫描图,重复上述步骤,直到输出所有顶点

注意:邻接表表示图的方式中,删除边则u的出度减1,v的入度减1

代码示例

// 使用邻接表
struct Vertex {
	int v;
	Vertex *next;
};
Vertex[n] Graph;

void topo(Vertex g[], int n) 
{
	// 初始化有向图所有顶点的入度(用入度来表示所有顶点的边)
	vector indegree(n, 0);
	for (int i = 0; i < n; i++) {
		Vertex *p = g[i]->next;
		while ( p ) {
			indegree[p->v]++;
			p = p->next;
		}
	}
	
	// 入度为0的边入队,队中为优先删除的顶点
	queue q;
	for (in i = 0; i < n; i++) {
		if (indegree[i] == 0) {
			q.push(i);
		}
	}
	
	while (!q.empty()) {
		int v = q.front();
		q.pop();
		printf("%d ", v);
		
		// 删除v顶点所有相邻的边
		Vertex *p = ad[v]->next;
		while (p) {
			int n = p->v;
			indegree[n]--;
			if (indegree[n] == 0) {
				q.push(n);
			}
			p = p->next;
		}
	}
}

你可能感兴趣的:(Algorithm,数据结构,算法)