以下内容参考书籍《数据结构与算法分析——C语言描述》
参考博客链接https://blog.csdn.net/tigerisland45/article/details/81108522(感谢博主)
拓扑排序是对有向无圈图的顶点的一种排序,它使得如果存在一条从vi到vj的路径,那么在排序中vj出现在vi的后面。拓扑排序中将有涉及到点的入度(indegree)以及图的表示方法(多见邻接表与邻接矩阵,补充:当图是稠密的,采用邻接矩阵来表示图;相反,用邻接表来表示图)
下图为一个无圈图:
该图应用拓扑排序的结果:
v1,v2,v5,v4,v3,v7,v6 和 v1,v2,v5,v4,v7,v3,v6两个都是拓扑排序的结果
模板整理:
说明:1、该模板使用数组实现,还可以使用队列实现顶点的相关操作;
2、该模板从第一个入度为0的顶点开始,可自由变化
拓扑排序
int aa[505][505]; //邻接矩阵的形式表示图
int in_degree[505]; //存放各个节点的入度
int ans[505]; //存放排列的顺序
int n,m;// 顶点个数,边的数目
//读入并存储图
void scan_G
{
// 初始化
memset(aa, 0, sizeof(g));
memset(in_degree, 0, sizeof(in_degree));
memset(ans, 0, sizeof(ans));
int u, v;
for(int i = 1; i <= m; i++)
{
scanf("%d%d", &u, &v);
aa[u][v] = 1;
in_degree[v]++; //计算入度
}
}
void topsort()
{
for(int i=1;i<=n;i++)
{
int k=1;
while(in_degree[k]!=0) //查找入读为0的点
k++;
ans[i]=k;
in_degree[k]=-1;
//将已经找出点k的邻接点的入度减一
for(int j=1;j<=n;j++)
if(aa[k][j])
in_degree[j]--;
}
}
用邻接表实现以及实现过程中队列的使用后续更新......