拓扑排序算法
拓扑排序算法
- 什么是拓扑排序
- 拓扑排序算法的作用
- 卡恩算法
- DFS算法
- 参考代码
什么是拓扑排序
给定一个有向无环图,排出一个含所有顶点的序列AAA满足:
对于图中的每条边(u,v)(u,v)(u,v),必须满足uuu在AAA中出现都在vvv的前面,则称序列AAA是该图的一定拓扑序。
拓扑排序算法的作用
- 生成拓扑序列
- 可以判断有向图中是否存在环
卡恩算法
通过计算顶点的度数来实现,对于一条边(u,v)(u,v)(u,v),在读取的时候计算顶点vvv的入度加1,完成所有的边的读入后,创建一个队列,将入度度数为0的顶点拉进队列,之后遍历这个顶点相邻的其他顶点,将这些边全部删除,也就是让相邻顶点的入度度数减1,当有顶点的入度度数为0的时候,将这个新顶点拉近队列,重复如此。
DFS算法
这个算法的核心思想是变色,给每个顶点三种颜色来区分,0就是没有遍历到,-1就正在遍历,1就是已经遍历完了的,每个顶点都会经历0−>−1−>10->-1->10−>−1−>1三个状态,如果发现遍历过程时出现了-1,说明遇到了环,此时返回FalseFalseFalse,退出程序。
参考代码
#include<bits/stdc++.h>
using namespace std;
using ll =long long ;const int N=1e6+10;vector<int>e[N],tp;
int n,m;
int d[N];//记录度数
int c[N];//染色标记
bool topsort(){queue<int>q;for(int i=1;i<=n;i++){if(d[i]==0)q.push(i);}while(!q.empty()){int t=q.front();q.pop();for(int v:e[t]){if(--d[v]==0)q.push(v);}tp.push_back(t);}return tp.size()==n;
}
bool dfs(int x){c[x]=-1;for(int y:e[x]){if(c[y]<0)return 0;else if(c[y]==0){if(!dfs(y))return 0;}}c[x]=1;tp.push_back(x);return 1;
}
int main(){cin>>n>>m;for(int i=1;i<=m;i++){int u,v;cin>>u>>v;d[v]++;}
}