拓扑排序板子

embedded/2024/10/18 18:21:59/

经过一晚上的不懈努力,创造出了一个很烂的拓扑排序的板子 

这是精简版

using ll = long long;
struct tsort {int n;std::vector<std::vector<int>>g, w;std::vector<int>r, c, dp,f;std::queue<int>q;tsort(int n_) {n = n_;g.resize(n + 1);w.resize(n + 1);r.resize(n + 1);c.resize(n + 1);f.resize(n + 1);dp.resize(n + 1);}void add(int x, int y, int v = 0) {//有向边g[x].push_back(y);//值w[x].push_back(v);//入度r[y]++;//出度c[x]++;}ll all(int x=0, ll M=0, int s=0) {ll ans = 0;if(s)q.push(s);else {for (int i = 1; i <= n; i++) {//if (x && i != x) {dp[i] = -1e9;if (r[i] == 0)q.push(i);}else if (M&&r[i] == 0) {q.push(i);f[i] = 1;}}}while (!q.empty()) {//int x = q.front();//q.pop();//for (int i = 0; i < g[x].size(); i++) {//int j = g[x][i];//if(M)f[j] = (f[j] + f[x]) % M;if(s)dp[j] = std::max(dp[j], dp[x] + w[x][i]);r[j]--;//if (r[j] == 0) {if (M&&c[j] == 0) {ans = (ans + f[j]) % M;continue;}q.push(j);//}}}return ans;}
};int main() {int n, m;std::cin >> n >> m;tsort t(n);while (m--) {int x, y;std::cin >> x >> y;t.add(x, y);}std::cout << t.all(0, 80112002,0);return 0;
}

传入第一个参数用于去除其它重复的入度为0的路径,传入第三个参数,用于计算从该点到其它的点的最长路径,两者通常结合在一起使用,传入第二个参数,用于计算入度为0出度为0的路径有多少个,第二个参数是模数.其它两个参数要设为0

下面这个是不省略的版本

using ll = long long;
struct tsort {int n;std::vector<std::vector<int>>g, w;std::vector<int>r, c, dp,f;std::queue<int>q;tsort(int n_) {n = n_;g.resize(n + 1);w.resize(n + 1);r.resize(n + 1);c.resize(n + 1);f.resize(n + 1);dp.resize(n + 1);}void add(int x, int y, int v = 0) {//有向边g[x].push_back(y);//值w[x].push_back(v);//入度r[y]++;//出度c[x]++;}//固定起点,去重bool dedup(int x) {//如果起点入度不为0,返回false//if (r[x])return false;for (int i = 1; i <= n; i++) {//if (i != x) {dp[i] = -1e9;if (r[i] == 0)q.push(i);}}while (!q.empty()) {//int x = q.front();//q.pop();//for (int i = 0; i < g[x].size(); i++) {//int j = g[x][i];//r[j]--;//if (r[j] == 0)q.push(g[x][i]);//}}return true;}//计算所有入度为0,出度为0的路径,M是模数ll pathsum(ll M= 80112002) {ll ans = 0;for (int i = 1; i <= n; i++) {if (r[i] == 0) {q.push(i);f[i] = 1;}}while (!q.empty()) {int x = q.front();q.pop();for (int i = 0; i < g[x].size(); i++) {int j = g[x][i];r[j]--;f[j] = (f[j] + f[x]) % M;if (r[j] == 0) {if (c[j] == 0) {ans = (ans + f[j]) % M;continue;}q.push(j);}}}return ans;}void work(int s) {q.push(s);while (!q.empty()) {int x = q.front();q.pop();//该点所对应的所有路径for (int i = 0; i < g[x].size(); i++) {dp[g[x][i]] = std::max(dp[g[x][i]], dp[x] + w[x][i]);if (!--r[g[x][i]])q.push(g[x][i]);}}}};int main() {int n, m;std::cin >> n >> m;tsort t(n);while (m--) {int x, y;std::cin >> x >> y;t.add(x, y);}std::cout << t.all(0, 80112002,0);return 0;
}

这个板子就略显臃肿

当然,如果你只想计算一条合理的拓扑序列,你可以将所有参数设为0,且将入度为0的点放入答案即可.


http://www.ppmy.cn/embedded/41896.html

相关文章

用wordpress建外贸独立站的是主流的外贸建站方式

WordPress因其易用性、灵活性和强大的功能支持&#xff0c;成为了外贸企业首选的网站建设平台。 从技术和功能角度来看&#xff0c;WordPress提供了丰富的主题和插件&#xff0c;这些都是构建专业外贸网站所必需的。例如&#xff0c;有专门为外贸网站设计的主题和插件&#xf…

8个迹象表明你需要一台新笔记本电脑,看一下你的笔记本是否有其中一个

序言 当你第一次打开你的笔记本电脑的盒子时,它会以最高性能运行,电池寿命更长,过热最小,资源使用效率高。然而,随着笔记本电脑的老化,它将不能满足预期用途。以下几个迹象表明,可能是时候寻找并投资一款新设备了。 你的设备不再具有预期用途 如果你的笔记本电脑不再…

变量初始化

提示&#xff1a;文章 文章目录 前言一、背景二、 2.1 2.2 总结 前言 前期疑问&#xff1a; 本文目标&#xff1a; 一、背景 最近在写c代码的时候&#xff0c;就涉及到变量的初始化。这边的变量当然指的是局部变量和类成员变量了。类成员变量其实也是局部变量啦。 另外就…

Android APP 剪切板应用

1 Android剪切板简介 Android 剪贴板是一个系统级服务&#xff0c;它允许应用程序之间共享文本、图像、二进制数据等多种形式的信息。用户可以通过常见的复制和粘贴操作&#xff0c;在不同的应用之间传递数据。该设计考虑到了易用性和灵活性&#xff0c;使得开发者可以轻松地为…

相约蓉城 | 全视通邀您参加 CHCC 2024第25届全国医院建设大会

第25届全国医院建设大会暨国际医院建设、装备及管理展览会&#xff08;CHCC2024&#xff09;&#xff0c;将于5月17日-19日在成都中国西部国际博览城盛大启幕。 全视通将携智慧病房、智慧门诊、智慧手术室、智慧后勤、智慧康养等产品方案亮相11号厅K05展位&#xff0c;期待与您…

如何用多个高斯泼溅合成新的场景【3DGS】

3D高斯泼溅&#xff08;3D Gaussian Splatting&#xff09;作为一种突破性摄影测量和可视化技术作为 SIGGRAPH 2023 上发表的研究论文的一部分发布。我相信3DGS是允许像你我这样的日常用户扫描 3D 的最佳现代方法并保留有机材料的精细细节&#xff0c;尤其是植物、树木、花卉和…

基于51单片机的自动浇花器电路

一、系统概述 自动浇水灌溉系统设计方案&#xff0c;以AT89C51单片机为控制核心&#xff0c;采用模块化的设计方法。 组成部分为&#xff1a;5V供电模块、土壤湿度传感器模块、ADC0832模数转换模块、水泵控制模块、按键输入模块、LCD显示模块和声光报警模块&#xff0c;结构如…

5.13网络编程

只要在一个电脑中的两个进程之间可以通过网络进行通信那么拥有公网ip的两个计算机的通信是一样的。但是一个局域网中的两台电脑上的虚拟机是不能进行通信的&#xff0c;因为这两个虚拟机在电脑中又有各自的局域网所以通信很难实现。 socket套接字是一种用于网络间进行通信的方…