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

拓扑排序

时间:2023-08-07 19:36:06浏览次数:33  
标签:int 拓扑 环图 序列 顶点 排序

拓扑序列是顶点活动网中将活动按照发生的先后顺序进行的一种排列。

 

拓扑排序,是对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序(Topological Order)的序列,简称拓扑序列。

 

有向无环图一定存在拓扑序列,所以有向无环图又被称为拓扑图。

以洛谷p4017最大食物链计数为例

主要代码如下:

 1 const int N = 5e5 + 10, inf = 0x3f3f3f3f3f3f3f3f, mod = 80112002;
 2 vector<int> vt[N];
 3 queue<int> q;
 4 bool book1[N], book2[N];
 5 int n, m, in[N], out[N], num[N];
 6 void solve() {
 7     cin >> n >> m;
 8     for (int i = 1; i <= m; i++) {
 9         int x, y;
10         cin >> x >> y;
11         vt[x].push_back(y);//记录x的出边
12         in[y]++;//y的入边条数+1
13         out[x]++;//x的入边条数+1
14     }
15     for (int i = 1; i <= m; i++)
16         if (!in[i]) {//找到没有入边的点作为起点
17             q.push(i);//将其入队
18             num[i] = 1;
19         }
20     while (!q.empty()) {
21         int to = q.front();
22         q.pop();
23         for (auto it : vt[to]) {//遍历队首元素的出边到达的点
24             in[it]--;//将其入边-1
25             num[it] = (num[it] + num[to]) % mod;//路径数量为入边+出边的条数
26             if (!in[it])q.push(it);//没有入边的话将点入队
27         }
28     }
29     int ans = 0;
30     for (int i = 1; i <= n; i++)
31         if (!out[i])//找到没有出边的点,其为最终点
32             ans = (ans + num[i]) % mod;
33     cout << ans;
34 }

 

标签:int,拓扑,环图,序列,顶点,排序
From: https://www.cnblogs.com/DLSQS-lkjh/p/17612520.html

相关文章

  • php多维数组自定义排序 uasort()
    对数组进行排序PHP有一些用来排序数组的函数,这个文档会把它们列出来。主要区别有:有些函数基于array的键来排序,而其他的基于值来排序的:$array['key']='value';。排序之后键和值之间的关联关系是否能够保持,是指排序之后数组的键可能会被重置为数字型的(0,1,2...)。排......
  • 二维数组排序,按其中某项排序
    /** * 二维数组排序 * @param $arrays         目标数组 * @param $sort_key       要排序的键 * @param int $sort_order 升序|降序 * @param int $sort_type  数字|字符串|通常 * @return $arrays         */function ......
  • LeetCode 周赛上分之旅 #38 结合排序不等式的动态规划
    ⭐️本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]和BaguTreePro知识星球提问。学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越抽象,它能覆盖的问题域就越广,理解难度也更复杂。在这个专栏里,小彭与你分享每场LeetCode周赛的解题报告,一......
  • 洛谷 P8500 - [NOI2022] 冒泡排序
    显然将权值离散化是没有问题的,因为必然存在一组最优解,满足每个\(a_i\)都取自于某个\(V_i\),于是不管三七二十一先将\(V_i\)离散化了再说。考虑从部分分入手逐步分析这道题:特殊性质A:\(V_i=1\)相当于这个区间中的数必须是\(1\),先将这些数去掉不管,紧接着考虑\(V_i=0\)的......
  • 笔记 | Sort 的实现逻辑与排序算法
    一、SortSort()的功能是对数组元素就地进行排序,会改变数组本身(返回对象同数组的引用)。默认排序顺序是,先将元素转换为字符串后进行排序。有一个可选参数compareFunction定义排序顺序的函数。返回值应该是一个数字,其正负性表示两个元素的相对顺序。array.sort([compareFunct......
  • 拓补排序
    #include<iostream>#include<algorithm>#include<vector>#include<stack>#defineN1001usingnamespacestd;intn,m,x,y;//顶点,边,vector<int>G[N];//动态数组stack<int>q;intcnt[N],tpc;boolpd(){for(inti=1;i<=n......
  • 输入任意整数,直到输入-1,用插入法排序以5行形式打印输出
    intmain(){ inta[100]; inti=0;intj=0;intn=0;intk=0; scanf("%d",&a[n]); n=0; while(a[n]!=-1) { n++; scanf("%d",&a[n]); } printf("BeforeSort:\n"); for(i=0;i<n;i++) { printf("%d",a[i......
  • C/C++ 数据结构-直接选择排序
    #include<iostream>#include<Windows.h>usingnamespacestd;voidswap(int*num1,int*num2){inttemp=*num1;*num1=*num2;*num2=temp;}intmain(){intret[]={161,156,170,164,158,180,159,185,172,176};intlen=......
  • 冒泡排序
    defbubble_sort(nums):  n=len(nums)  foriinrange(n-1):    forjinrange(n-i-1):      ifnums[j]>nums[j+1]:        nums[j],nums[j+1]=nums[j+1],nums[j]nums=[5,3,8,2,1]print("排序前:",nums)bubble_sort(......
  • 基数排序详解
    基数排序详解1)前言:计数排序要学基数排序,掌握计数排序非常重要。计数排序的原理十分的简单。举个例子,排序52413,你打算怎么办?很简单是不是,冒泡排序、选择排序、归并排序……这些都足以解决。但如果你有100000000个数要排序,你可能就要束手就擒了。那如归这时候我告诉你:这1000......