图论~~拓扑排序

图论~~拓扑排序

在图论中,拓扑排序(Topological Sorting)是一个有向无环图(DAG, Directed Acyclic Graph)的所有顶点的线性序列。且该序列必须满足下面两个条件:

  1. 每个顶点出现且只出现一次。
  2. 若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面

拓扑排序的方法:

       1. 从 DAG 图中选择一个 没有前驱(即入度为0)的顶点并输出。

        2.从图中删除该顶点和所有以它为起点的有向边。

        3.重复以上操作

    图示如下:


首先这是一个有向无环图,即DAG网

第一步我们找出入度为0的点,即A,入队列,,去掉该点以及所有与A点有关的线段,图示如下


第一步我们找出入度为0的点,即B,C,任取一点入队列即可,如B,去掉该点以及所有与B点有关的线段,图示如下


重复以上操作,知道全部的点都入队列,如果有点没有入队列,说明存在环(因为会在遇到环时一个,找不到入度为0的点)

代码如下:

void topusort()
{
	while(!q.empty())  //q 一个队列,保存的是入度为0的点,如果所有入度为0的点都遍历过,就说明找完了
	{
	int t=q.front(); //t 是队首元素	
		q.pop();
		temp[k++]=t;  //保存路径
		for(int i=0;i<v[t].size();i++)
		{
			int t1=v[t][i];  //与入度为0的点相连接的点
		count[t1]--;	 //count[]保存的是每一个点的入度,将与入度为0的点相连的边去掉
		if(!count[t1])	  //(如果某点的入度为0)
			q.push(t1); //入队列
		}
		
	}
}

其中代码中的k如果不等于节点数,说明一定存在回路,

并且如果存在好几个入度为0的点,说明排列顺序不唯一,如果让求比赛的结果,则说明比赛的结果不能找出第1,2,3,4,,,,名。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值