拓扑排序【模板整理】

以下内容参考书籍《数据结构与算法分析——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]--;
	    
	}
}

 

用邻接表实现以及实现过程中队列的使用后续更新......

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值