c++任意给定一个有向图,设计一个算法,对它进行拓扑排序。拓扑排序算法思想:a.在有向图中任选一个没有前趋的顶点输出;b.从图中删除该顶点和所有以它为尾的弧;c.重复上述a、b,直到全部顶点都已输出,此时,顶点输出序列即为一个拓朴有序序列;或者直到图中没有无前趋的顶点为止,此情形表明有向图中存在环。
时间: 2024-02-29 16:51:52 浏览: 68
拓扑排序算法 c++
4星 · 用户满意度95%
好的,下面是一个使用C++实现的基于深度优先搜索的拓扑排序算法:
```c++
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int N = 100010;
vector<int> G[N];
int in_degree[N];
void topological_sort(int n) {
queue<int> q;
for (int i = 1; i <= n; i++) {
if (in_degree[i] == 0) {
q.push(i);
}
}
while (!q.empty()) {
int u = q.front();
q.pop();
cout << u << " ";
for (int i = 0; i < G[u].size(); i++) {
int v = G[u][i];
in_degree[v]--;
if (in_degree[v] == 0) {
q.push(v);
}
}
}
}
int main() {
int n, m;
cin >> n >> m;
for (int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
G[u].push_back(v);
in_degree[v]++;
}
topological_sort(n);
return 0;
}
```
其中,变量n表示有向图的顶点数,m表示有向图的边数,G[u]表示顶点u的所有出边所连向的顶点集合,in_degree[i]表示顶点i的入度。在程序中,我们首先遍历所有顶点,将每个顶点的入度计算出来,并将入度为0的顶点加入一个队列Q中。然后,从队列Q中取出一个顶点u,输出u,并将u从图中删除。接着,遍历u的所有邻接点v,将v的入度减1。如果减1后v的入度为0,则将v加入队列Q中。重复上述过程,直到队列Q为空为止。如果在执行过程中出现了某个时刻队列Q为空但图中还有顶点没有输出,说明图中存在环,无法进行拓扑排序。
阅读全文