图的拓扑排序

图的基本算法-拓扑序列

拓扑排序

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

拓扑排序基本算法

对于一个有向无环图:

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

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

代码示例

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

void topo(Vertex g[], int n) 
{
	// 初始化有向图所有顶点的入度(用入度来表示所有顶点的边)
	vector<int> 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<int> 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;
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值