拓扑排序(学习笔记)
对一个有向无环图(DAG)进行拓扑排序。
实现:
1.在有向图中选一个没有前驱的顶点并且输出
2.从图中删除该顶点和所有出边
3.重复1、2步骤,直至所有顶点输出
初始化:
vector<int>vec[maxn];
scanf("%d%d",&n,&m);//n个点,m条边
int n,m,u,v;
int InDeg[maxn];//入度
while(m--){
scanf("%d%d",&u,&v);
vec[u].push_back(v);
InDeg[v]++;
}
判断是否有环:
queue<int>q;
int num;//统计排好序的元素个数
bool topsort(){
for(int i=1;i<=n;i++){
if(!InDeg[i]) q.push(i);
}
while(!q.empty()){
int now=q.front();
q.pop();
num++;
for(int i=0;i<vec[now].size();i++){
if(--InDeg[vec[now][i]]==0)
q.push(vec[now][i]);
}
}
if(num==n) return true;//无环
else return false;//有环
}
版权声明:本文为GW_Krystal原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。