zoukankan      html  css  js  c++  java
  • [算法板子] 求拓扑序列(拓扑排序)

    前言 / 导言

    拓扑排序有多种求法,可用DFSBFS求出,其中如果需要求出按字典序排列的拓扑序,则需要使用BFS将再将队列换为优先队列即可。

    存图方法

    邻接表(链式向前星结构)存图,每个点的入度为d数组

    int head[M], ne[N], to[N], idx, d[M];
    bool st[M];
    
    void add ( int a, int b )
    {
    	d[b]++;		// b 的入度加 1
    	to[idx] = b;
    	ne[idx] = head[a];
    	head[a] = idx++;
    }
    

    以下为拓扑排序的模板

    模板一:优先队列法

    优先队列中存的是点的编号

    res容器中存的是最终答案

    /* 邻接表(链式向前星)存图 */
    void topsort ( int n, int m ) // 顶点数、边数
    {
    	vector<int> res;
    	priority_queue<int, vector<int>, greater<int> > q;
    
    	for ( int i = 1; i <= n; i++ )
    	{
    		if ( d[i] == 0 ) q.push ( i );
    	}
    
    	while ( !q.empty() )
    	{
    		int t = q.top(); q.pop();
    
    		res.push_back ( t );				// 记录拓扑序
    
    		for ( int i = head[t]; i != -1; i = ne[i] )
    		{
    			int b = to[i];
    			if ( --d[b] == 0 ) q.push  ( b );
    		}
    	}
    }
    

    模板题:HDU1285

    好题推荐:POJ1270

    作者:Jude_Zhang
    关于博主:评论和私信会在第一时间回复。或者直接私信我。
    版权声明:本博客所有文章除特别声明外,均采用BY-NC-SA 许可协议。转载请注明出处!
    支持博主:如果您觉得文章对您有帮助,可以点击文章下方赞一下。您的鼓励是博主的最大动力!
  • 相关阅读:
    Centos7.3安装jdk和maven
    Centos7.3安装sftp服务和ssh
    Centos7.3安装,并设置网络和防火墙
    Docker 常用命令
    Tomcat配置
    MySQL配置
    配置JDK
    JTable的模型
    JavaBean和List<JavaBean>
    JavaBean
  • 原文地址:https://www.cnblogs.com/judezhang/p/14659441.html
Copyright © 2011-2022 走看看