首页 > 其他分享 >关于拓扑排序

关于拓扑排序

时间:2024-03-12 09:57:37浏览次数:19  
标签:活动 工程 int 拓扑 前驱 关于 排序

定义

拓扑排序

在一个 DAG(有向无环图) 中,我们将图中的顶点以线性方式进行排序,使得对于任何的顶点 \({u}\) 到 \({v}\) 的有向边 \({(u,v)}\), 都可以有 \({u}\) 在 \({v}\) 的前面。

还有给定一个 DAG,如果从 \({i}\) 到 \({j}\) 有边,则认为 \({j}\) 依赖于 \({i}\)。如果 \({i}\) 到 \({j}\) 有路径(\({i}\) 可达 \({j}\)),则称 \({j}\) 间接依赖于 \({i}\)。

拓扑排序的目标是将所有节点排序,使得排在前面的节点不能依赖于排在后面的节点。

补充

\({\large 关于AOV网}\)
在日常生活中,一项大的工程可以看作是由若干个子工程(这些子
工程称为“活动” )组成的集合,这些子工程(活动)之间必定存在
一些先后关系,即某些子工程(活动)必须在其它一些子工程(活动)
完成之后才能开始,我们可以用有向图来形象地表示这些子工程(活动)
之间的先后关系,子工程(活动)为顶点,子工程(活动)之间的先后
关系为有向边,这种有向图称为“顶点活动网络”
,又称“AOV网”。

在AOV网中,有向边代表子工程(活动)的先后关系,我们把一
条有向边起点的活动成为终点活动的前驱活动,同理终点的活动称
为起点活动的后继活动。而只有当一个活动全部的前驱全部都完成
之后,这个活动才能进行。例如在上图中,只有当工程1完成之后,
工程2、3、4、5、6才能开始进行。只有当2、3、4全部完成之后,7
才能开始进行。
一个AOV网必定是一个有向无环图,即不应该带有回路。否则,
会出现先后关系的自相矛盾。

上图就是一个出现环产生自相矛盾的情况。4是1的前驱,想完
成1,必须先完成4。3是4的前驱,而2是3的前驱,1又是2的前驱。
最后造成想完成1,必须先完成1本身,这显然出现了矛盾。

板板

板板
int n, m; //结点数和边数
vector<int> G[MAXN]; //存图
int in[MAXN]; // 存储每个结点的入度

//拓扑排序
bool toposort() {
    vector<int> ans;
    queue<int> q;
    //入度为0的点入队
    for (int i=1; i<=n; i++) {
        if(in[i]==0){
            q.push(i);
        }    
    }
    while (!q.empty()) {
        int u=q.front();
        q.pop();
        ans.push_back(u);
        for (auto v:G[u]) { //所有邻接点入度减1
            in[v]--;            
            if(in[v]==0) { //入度变为0,则入队
                q.push(v);
            }
        }
    }
    if(ans.size()==n){ //不存在环,输出序列
        for (auto i:ans){
            cout<<i<<' ';
        }
        return true;
    }
    else{ //存在环
        return false;
    }
}

例题

家谱树

问题描述

有个人的家族很大,辈分关系很混乱,请你帮整理一下这种关系。
给出每个人的孩子的信息。
输出一个序列,使得每个人的后辈都比那个人后列出。

输入格式:

第1行一个整数N(1<=N<=100),表示家族的人数。
接下来N行,第I行描述第I个人的儿子。
每行最后是0表示描述完毕。

输出格式:

输出一个序列,使得每个人的后辈都比那个人后列出。
如果有多解输出任意一解。

样例输入:

5
0
4 5 1 0
1 0
5 3 0
3 0

样例输出:

2 4 5 3 1

思路

纯纯板子题

code

code
#include<bits/stdc++.h>
using namespace std;
#define N 1010
#define ll long long
#define inf 0x3f3f3f3f
#define Elaina 0
int a[N][N],ans[N];
queue <int> q;
int n,m;
void toposort(){
	for(int i=1;i<=n;i++){
		if(!ans[i]){
			q.push(i);
		}
	}
	while(!q.empty()){
		int k=q.front();
		q.pop();
		cout<<k<<" ";
		for(int i=1;i<=n;i++){
			if(a[k][i]){
				ans[i]--;
				a[k][i]=0;
				if(!ans[i]){
					q.push(i);
				}
			}
		}
	}
	return ;
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		while(1){
			cin>>m;
			if(!m){
				break;
			}
			a[i][m]=1;
			ans[m]++;
		}
	}
	toposort();
	return Elaina;
} 

AC代码

int main(){}

这个真的可以过(在HZOI题库里) 我没骗你

都看到这了,真的不点个赞吗(>ω<*)

标签:活动,工程,int,拓扑,前驱,关于,排序
From: https://www.cnblogs.com/Elaina-0/p/18067175

相关文章

  • 你知道h.265吧?但关于AV1编码格式你也来了解一下吗?
    介绍一下av1格式AV1(AOMediaVideo1)是一种开放、免版税的视频编码格式,旨在用于视频传输和存储。它由开放媒体联盟(AllianceforOpenMedia,AOM)开发,这是一个由Google、Mozilla、Cisco、Amazon、Intel、Microsoft、Netflix等多家公司组成的联盟。AV1旨在取代VP9并成为与HEVC(H.265)......
  • 快速排序
    快排属于分治算法;思想:快排的思想是分治我们有一个待排序的数组,长度为n。选定一个基准,将数组分成左右两部分,左边的数小于基准,右边的数大于基准。然后我们分别看分割后左右两部分数组,如果元素个数大于1,就再次分割。直到最后,我们得到了n个数组,每个数组含有1个元素。这n个数组......
  • 排序链表(自底向上归并排序)
    题目:时间复杂度:O(nlogn),空间复杂度:O(1)structListNode{intval;ListNode*next;ListNode():val(0),next(nullptr){}ListNode(int_val):val(_val),next(nullptr){}ListNode(int_val,ListNode*_next):val(_val),next(_next){}};class......
  • 蓝帽杯2023web-关于侧信道
    复现完2022年那个fastjson,本来想看看2023还有没有java能学,发现是一个php反序列化,但是这个php有说法的,因为用到了我从来没有见过的侧信道知识。直接看源码吧,一目了然的:<?phpclassSaferman{public$check=True;publicfunction__destruct(){if($this->check......
  • 关于网络的一些东西
    网络趣事你是一台孤单的电脑A 直到有一天,你希望与另一台电脑B建立通信,于是你们各开了一个网口,用一根网线连接了起来。 用一根网线连接起来怎么就能"通信"了呢?我可以给你讲IO、讲中断、讲缓冲区,但这不是研究网络时该关心的问题。如果你纠结,要么去研究一下操作系......
  • pandas - 数据排序
    sort_values()函数importpandasaspddata={'名称':['太阳能','床','风扇','沙发'],'单价':[2000,3500,500,3500],'数量':[58,23,69,60]}df=pd.DataFrame(data)#单条件排序,使......
  • MySQL分组之后按照固定顺序排序 FIELD
    以下回答来自通义千问:要按照特定顺序显示type字段的统计结果,MySQL并没有提供直接按指定顺序进行GROUPBY的方法。但是,你可以结合ORDERBY语句和FIELD()函数来实现这一需求。FIELD()函数可以将某个字段的值与一系列指定值进行比较,并按照指定值的顺序排序。假设你希望固定的type顺......
  • 关于Pyinstaller在打包Streamlit程序时遇到的IndexError:tuple index out of range
    如题,在使用Pyinstaller库打包过程中,如果遇到IndexError:tupleindexoutofrange,不必惊慌,本质上是库函数在传参过程中出现异常下面是解决方案:找到..\envs\steamlit\lib\dis.py这个文件。如果你是用的虚拟环境,比如conda,那这个文件位于anaconda的安装目录"E:\SOFTWARE\ANAC......
  • python 有关于四舍五入,四舍六入的内容
    一、简介二、内容三、问题 一、简介最近看书看到了,有关python 内置的函数round取小数点的问题。书上描述的是四舍五入,然后又说,‘四舍五入’只是个约定的说法,并非所有的.5都会被进位。然后我再上网查了下,才知道,之前使用的四舍五入后面,还有个四舍六入五成双......
  • 关于"李彦宏"的“程序员”职业未来将不复存在的言论的思考
    在3月9日央视的《对话》·开年说节目上,百度创始人、董事长兼CEO李彦宏表示,以后不会存在“程序员”这种职业了,因为只要会说话,人人都会具备程序员的能力。”李总表达的有2个信息点:1,以后不会有“程序员”这个职业了2,只要会说话,人人都会有程序员的能力 初看心里面波澜澎湃,后来在......