图论~~拓扑排序
在图论中,拓扑排序(Topological Sorting)是一个有向无环图(DAG, Directed Acyclic Graph)的所有顶点的线性序列。且该序列必须满足下面两个条件:
- 每个顶点出现且只出现一次。
- 若存在一条从顶点 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,,,,名。