一,概念
1.DAG图:一个有向图中不存在环,则称为有向无环图,简称DAG图
2.拓扑排序:在DAG图中,所有活动可排列成一个线性序列,使得每个活动的所有前驱活动都排在该活动的前面,我们把此序列叫做拓扑序列,由DAG图构造拓扑序列的过程叫做拓扑排序。
二,实现过程
First:从DAG图中选择一个没有前驱的顶点并输出
Next:从图中删除该顶点和以该顶点为起点的有向边。
Last:重复1、2,直到当前的DAG为空,或者当前图中不存在有前驱的顶点为止。如果最终图不为空,则必然存在环。
#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
using namespace std;
int n,m;
vector<int> g[MAXN];
queue<int> q;
int in[MAXN];//每个顶点的入度
void Topsort(){
for(int i=1;i<=n;i++){
if(in[i]==0){
q.push(i);
}
}//将入度为0的点加入队列
while(!q.empty()){
int t=q.front();
cout<<t<<" ";//获得拓扑排序
q.pop();
for(int i=0;i<(int)g[t].size();i++){
int idx=g[t][i];//遍历t的每个后继
if(--in[idx]==0){//将删除边后入度为0的点加入队列
q.push(idx);
}
}
}
}
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int u,v;
cin>>u>>v;
g[u].push_back(v);
in[v]++;
}
return 0;
}
标签:排序,int,拓扑,DAG,顶点,include
From: https://www.cnblogs.com/Pagani/p/18329757