含义
拓扑排序是对有向无环图(DAG)的一种排序算法,在拓扑排序中,通常会以事件形式出现,
比如事件A、事件B、事件C、事件D,事件B必须在事件A前完成,事件A必须在事件C前完成,事件D必须在事件A前完成,事件B必须在事件D前完成。
我们可以如下建图:
入度与出度
一个点被其他边连接的边叫做这个点的入度,一个点向外连接的边叫做这个点的出度。
比如:
此时我们称点B有两个入度
此时我们称点A有两个出度
排序方式
而拓扑排序就是每次将入度为0的点放入队列,然后把与这个点出度连接的店的入度减一。
例如B D A C就是样例的一种合法拓扑排序。
注意:拓扑排序答案并不唯一,如:
此时拓扑排序有不止一种,
B F A D C E
B F D A C E
都是正确的拓扑排序。
例题
B3644 【模板】拓扑排序 / 家谱树
此题为拓扑排序模板。
#include<bits/stdc++.h>
using namespace std;
int n;//点数
int v;//线
int in[105];//存储入度
vector<int> l[105];//邻接表
queue<int> q;//队列
void topsort(){//拓扑排序函数
for(int i=1;i<=n;i++){
if(in[i]==0)q.push(i);//点的入度为0时加入队列
}
while(!q.empty()){//判空
int head=q.front();q.pop();//取头弹出
cout<<head<<" ";//输出
for(int x:l[head]){//遍历连接点
in[x]--;//入度减一
if(in[x]==0)q.push(x);//点的入度为0时加入队列
}
}
}
int main(){
cin>>n;//输入点数
for(int i=1;i<=n;i++){//遍历点
while(true){//输入边
cin>>v;
if(v==0)break;
l[i].push_back(v);//连接边
in[v]++;//连接点入度加一
}
}
topsort();//调用拓扑排序函数
return 0;
}
题目推荐
点个赞吧