今天学习了拓扑排序
他的思想其实是在一个有向无环图中,开始 先找出一个入度为0的节点,然后入队,之后删除这个节点发出的所有边,然后图发生了变化 这时候剩下的节点的入度也有可能会
变, 所以每次都需要更新,然后出队 , 然后继续找入度为0 的节点,入队 。
那么结束是如何判断的呢!
结束时 分 两种情况
队空 则加个计数器 看出队了多少次
如果计数器的num==n 则拓扑排序成功!、
否则 失败 说明有回路 有两个节点入度无法等于0
thats
all
小生拙见 欢迎大佬批评!!!
下面给上代码 用邻接矩阵实现的!
#include<iostream>
#include <vector>
#include <queue>
using namespace std;
void topsort(vector<vector<int>> & A , int n ,vector<int> &B){
cout<<"topsort begin!"<<endl;
int num=0;
queue<int> c;
for (int i = 0; i < n; ++i) {
if (B[i]==0)
c.push(i);
}
while (!c.empty()){
int t=c.front();
cout<<t<<" ";
c.pop();
for (int i = 0; i < A[t].size(); ++i) {
int v=A[t][i];
B[v]--;
if (B[v]==0){
c.push(v);
}
}
A[t].clear();
num++;
}
if (num==n){
cout<<" over !"<<endl;
}else{
cout<<"defeat!"<<endl;
}
}
int main(){
int n,m;
cout<<"请输入节点数和边数"<<endl;
cin>>n>>m;
vector<vector<int>> A(n);
cout<<"请输入边,由起点指向末尾";
for (int i = 0; i < m; ++i) {
int x,y;
cin>>x>>y;
A[x].push_back(y);
}
vector<int> indegree(n);
for (auto x : A)
for(auto y : x){
indegree[y]++;
}
topsort(A,n,indegree);
}
测试样例 //网上找的
8 9
0 2
1 2
2 3
2 4
3 5
4 6
6 5
5 7
6 7
就这了!!