拓扑排序(习题笔记 思路整理)之一

​​​​​​1.P4017 最大食物链计数

确实比较板子,但是考验思维,我愿称之为思维拓扑排序

作为拓扑的第一题,确实没想到要进行思维处理

这里考虑用一种dp的思维方式(?

多引入两个变量,一个记录出度,一个记录每一个点的种类数量,这样就可以一直满足不同方向过来所产生的种类数量

出度的缘由是这里需要绝对的两端(我开始以为是大于二的食物链都行,那样的话就每一次操作都+1就好)

贴代码(不要忘记取模,不然只有两个点捏)

// Problem: 
//     P4017 最大食物链计数
//   
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P4017
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)#include<iostream>
#include<queue>
#include<vector>
using namespace std;
const int N=5010;
vector<int> e[N];
int ans;
int din[N];//入度
int oin[N];//出度
int n,m;
int f[N];//每个点的数量void toposort(){queue<int> q;for(int i=1;i<=n;++i){if(din[i]==0) q.push(i),f[i]=1;}	while(q.size()){auto k=q.front();q.pop();for(auto t:e[k]){if(--din[t]==0) q.push(t);f[t]=(f[k]+f[t])%80112002;}}for(int i=1;i<=n;++i){if(oin[i]==0) ans=(f[i]+ans)%80112002;}
}int main(){cin>>n>>m;while(m--){int a,b;cin>>a>>b;e[a].push_back(b);++din[b];++oin[a];}	toposort();cout<<ans%80112002<<endl;return 0;
}

2.P2712 摄像头

这道题比较板子,在操作的时候,如果pop就ans--即可,有几个坑点

输出yes 摄像头的范围  摄像头所能照到的位置不一定会存在摄像头(怎么会有题卡这种鬼地方)

// Problem: 
//     P2712 摄像头
//   
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P2712
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)#include<iostream>
#include<queue>
#include<vector>
using namespace std;
const int N=505;
vector<int> e[N];
int ans=0;
int din[N];
bool check[N];
vector<int> kkk(N);void toposort(){queue<int> q;for(int i=1;i<=ans;++i){if(din[kkk[i]]==0) q.push(kkk[i]);}while(q.size()){auto t=q.front();q.pop();//cout<<t<<endl;//cout<<ans<<endl;//cout<<endl;if(check[t]) ans--;for(auto x:e[t]){if(--din[x]==0) q.push(x);}}
}int main(){int n;cin>>n;ans=n;int cnt=0;while(n--){int a,b;cin>>a>>b;if(!check[a]) kkk[++cnt]=a,check[a]=true;while(b--){int k;cin>>k;e[a].push_back(k);din[k]++;}}toposort();if(ans==0) cout<<"YES"<<endl;else cout<<ans<<endl;return 0;
}

3.P1137 旅行计划

这道题比上一道题要简单不少,与第一题思路相同,但这一题的想法就是维护一个max就好了,我其实没有太看懂提,但是这么操作不管有几个起始点,都可以获得最大的值(看来自各个方向哪个大就选哪个方向)

// Problem: 
//     P1137 旅行计划
//   
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1137
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)#include<iostream>
#include<queue>
#include<vector>
using namespace std;
const int N=1e5+10;
vector<int> e[N];
int din[N];
int f[N];
int n,m;void toposort(){queue<int> q;for(int i=1;i<=n;++i){if(din[i]==0) q.push(i);f[i]=1;}while(q.size()){auto t=q.front();q.pop();for(auto x:e[t]){if(--din[x]==0) q.push(x);f[x]=max(f[t]+1,f[x]);}}
}
int main(){cin>>n>>m;while(m--){int a,b;cin>>a>>b;e[a].push_back(b);din[b]++;}toposort();for(int i=1;i<=n;++i) cout<<f[i]<<endl;return 0;
}

4.P1960 郁闷的记者

这道题难过的令人无语,调试了一整天才发现是读错题了。这题面真的阴间.......

我的想法是开两个堆分别维护最大字典序和最小字典序,如果答案不同说明有不同情况(极端情况)

贴代码

// Problem: 
//     P1960 郁闷的记者
//   
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1960
// Memory Limit: 500 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)#include<iostream>
#include<vector>
#include<queue>
using namespace std;
const int N=1e4+10;
int cnt1[N];//记录名次
int cnt2[N];
int n,m;
vector<int> e[N];
int din1[N];
int din2[N];void toposort(){priority_queue<int> a;priority_queue<int,vector<int>,greater<int>> b;for(int i=1;i<=n;++i){//cout<<din1[i]<<endl;if(din1[i]==0){a.push(i);b.push(i);//cout<<i<<endl;}}int now=0;while(a.size()){auto t=a.top();a.pop();cnt1[t]=++now;//cout<<t<<endl;//cout<<t<<endl;for(auto x:e[t]){if(--din1[x]==0) a.push(x);}}now=0;while(b.size()){auto t=b.top();b.pop();cnt2[t]=++now;cout<<t<<endl;for(auto x:e[t]){if(--din2[x]==0) b.push(x);}}
}int main(){cin>>n>>m;while(m--){int a,b;cin>>a>>b;e[a].push_back(b);din1[b]++;din2[b]++;}toposort();//for(int i=1;i<=n;++i) cout<<cnt2[i]<<endl;for(int i=1;i<=n;++i){if(cnt1[i]!=cnt2[i]){cout<<1<<endl;return 0;}}cout<<0<<endl;return 0;
}

5.P6145 [USACO20FEB] Timeline G

一遍就AC,想的时间也是最短的。

但是这道题确实比较难想,要是没跟我说这是拓扑排序我不一定能想到。这道题比较隐晦,我的思路是一个类似dp的操作(每一次都更新最大),也就是每一次都要更新到最大。

这里使用拓扑排序的原因,我总结为:每一个的结局时间都是不确定的,要先确定前面的才能确定后面的,这个过程就是一个拓扑序。

在这个拓扑序遍历的时候,对每一次进行更新(对某个点有影响的所有点(已经没有入度了)继续更新),语言无力,请看代码。(我没看懂题解区说的递推是啥

// Problem: 
//     P6145 [USACO20FEB] Timeline G
//   
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P6145
// Memory Limit: 256 MB
// Time Limit: 2000 ms
// 
// Powered by CP Editor (https://cpeditor.org)#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int n,m,s;
const int N=1e5+10;
int f[N];
vector<pair<int,int>> e[N];
int din[N];void toposort(){queue<int> q;for(int i=1;i<=n;++i){if(din[i]==0) q.push(i);}while(q.size()){auto t=q.front();q.pop();for(auto x:e[t]){int a=x.first,b=x.second;f[a]=max(f[a],f[t]+b);//每次都更新一下if(--din[a]==0) q.push(a);}}
}int main(){cin>>n>>m>>s;for(int i=1;i<=n;++i) cin>>f[i];while(s--){int a,b,c;cin>>a>>b>>c;e[a].push_back({b,c});din[b]++;}toposort();for(int i=1;i<=n;++i) cout<<f[i]<<endl;return 0;
}

6.P1807 最长路

这道题有点坑,有不少遭点,一开始我以为可以直接copy上一题代码(还是太想去睡觉了),结果发现必须是从1到n的路径。

这里有几个坑点

1.从1到n  且题目已经告诉你路径一定是从小节点到大节点的,枉我想了这么久的环

2.这里的权值可以是负数,所以应该把2-n的所有编程-1e9

3.由于指定了起始位置,还会存留一下入度为0的值,对后面的数字造成不良影响,对此,我们可以把这些先一步捞出来处理一下就好,见代码

好像是dp的方法吧,话说感觉越来越板了,拓扑都是这样的题目,每道题都要结合一点dp思想来着

上代码

#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int n,m,s;
const int N=2000;
const int M=5e4+10;//数据不要开错了
int f[N];
vector<pair<int,int>> e[M];
int din[N];
bool check;void toposort(){queue<int> q;for(int i=2;i<=n;++i){if(din[i]==0) q.push(i);f[i]=-1e9;}while(q.size()){//多一个处理,减少这些不会入队的值对入队的影响auto t=q.front();q.pop();for(auto x:e[t]){int a=x.first;if(--din[a]==0) q.push(a);}}q.push(1);while(q.size()){auto t=q.front();q.pop();if(t==n) check=true;for(auto x:e[t]){int a=x.first,b=x.second;f[a]=max(f[a],f[t]+b);if(--din[a]==0) q.push(a);}}
}int main(){cin>>n>>m;while(m--){int a,b,c;cin>>a>>b>>c;e[a].push_back({b,c});din[b]++;}toposort();if(check) cout<<f[n]<<endl;else cout<<-1<<endl;return 0;
}

7.P1113 杂务

这道题小细节比较多,我调试了一个钟,但是思路与前面又很大的相似之处,其实好像又是dp思想,难度不大,直接贴代码

// Problem: 
//     P1113 杂务
//   
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P1113
// Memory Limit: 125 MB
// Time Limit: 1000 ms
// 
// Powered by CP Editor (https://cpeditor.org)#include<iostream>
#include<vector>
#include<queue>
using namespace std;
int n;
const int N=1e4+10;
int din[N];
int f[N];
int now[N];
vector<int> e[N];
int ans=0;void toposort(){queue<int> q;for(int i=1;i<=n;++i){if(din[i]==0) q.push(i);}while(q.size()){auto t=q.front();q.pop();ans=max(ans,now[t]);for(auto x:e[t]){now[x]=max(now[x],now[t]+f[x]);//cout<<now[x]<<endl;//cout<<1<<endl;if(--din[x]==0) q.push(x);}}
}int main(){cin>>n;for(int i=1;i<=n;++i){cin>>i;int k;cin>>f[i];now[i]=f[i];while(cin>>k){if(k==0) break;else{e[k].push_back(i);din[i]++;//cout<<i<<' '<<din[i]<<endl;}}}//for(int i=1;i<=n;++i) cout<<din[i]<<endl;toposort();cout<<ans<<endl;return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/789587.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[RK3588-Android12] 调试MIPI-双通道-压缩屏(Video Mode/MIPI Dphy 8Lane/DSC 144HZ)

问题描述 被测屏幕&#xff1a;小米Pad6 分辨率&#xff1a;1800X2880 模式&#xff1a;Video Mode/MIPI Dphy 8Lane/DSC 144HZ PPS: 11 00 00 89 30 80 0B 40 03 84 00 14 01 C2 01 C2 02 00 01 F4 00 20 01 AB 00 06 00 0D 05 7A 06 1A 18 00 10 F0 03 0C 20 00 06 0B 0B 33…

linux进程退出之exit与_exit

linux进程退出之exit与_exit _exitexit流程清理函数atexit()函数&#xff1a;on_exit()函数&#xff1a; _exit /* Terminate program execution with the low-order 8 bits of STATUS. */ /** status参数定义了进程的终止状态&#xff0c;父进程可以通过wait&#xff08;&am…

腾讯云邮件推送功能有哪些?如何有效使用?

腾讯云邮件推送如何设置&#xff1f;怎么用邮件推送做高效营销&#xff1f; 腾讯云作为业界领先的云服务提供商&#xff0c;其邮件推送功能在便捷性、稳定性和安全性上都有着出色的表现。那么&#xff0c;腾讯云邮件推送功能究竟有哪些呢&#xff1f;让AokSend来探个究竟。 腾…

银川岗位外包选邦芒人力 一站式解决企业全方位用工需求

岗位外包是一种现代的人力资源管理模式&#xff0c;其核心在于企业将特定的岗位或岗位群的工作内容外包给专业的服务机构&#xff0c;如邦芒人力&#xff0c;来负责完成。企业因此能够专注于自身核心业务的发展&#xff0c;提升行业竞争力。 具体而言&#xff0c;岗位外包使得…

基于SpringBoot+微信小程序的图书借阅管理系统(包运行调试)

介绍 系统介绍 是一套图书借阅管理系统&#xff0c;包括用户小程序以及后台管理系统。 前台商城系统包含用户注册登录、首页门户、图书查询、在线借阅、个人中心、我的信息、我的借阅、押金充值。 后台管理系统包含统计分析、用户管理、分类管理、图书管理、借阅管理、管理员…

HarmonyOS NEXT应用开发之@Observed装饰器和\@ObjectLink装饰器:嵌套类对象属性变化

上文所述的装饰器仅能观察到第一层的变化&#xff0c;但是在实际应用开发中&#xff0c;应用会根据开发需要&#xff0c;封装自己的数据模型。对于多层嵌套的情况&#xff0c;比如二维数组&#xff0c;或者数组项class&#xff0c;或者class的属性是class&#xff0c;他们的第二…

【Python】Pillow支持的图像文件格式

完全支持格式只读格式只写格式仅标识格式BLPCURPALMBUFRBMPDCXPDFGRIBDDSFITSXV ThumbnailsHDF5DIBFLCMPEGEPSFPXGIFFTEXICNSGBRICOGDIMIMTJPEGIPTC/NAAJPEG 2000MCIDASMSPMICPCXMPOPNGPCDPPMPIXARSGIPSDSPIDERQOITGASUNTIFFWALwebpWMF、EMFXBMXPM 参考文献 图像文件格式 - P…

教育信创 | 云轴科技ZStack联合飞腾发布全场景教育信创白皮书

随着数字化时代的到来&#xff0c;教育行业正面临着前所未有的挑战与机遇。为了推动教育行业的数字化转型和信创人才培养&#xff0c;云轴科技ZStack联合飞腾于3月28日正式发布了《教育行业数字化自主创新飞腾生态解决方案白皮书》&#xff08;简称《教育白皮书》&#xff09;。…

新能源汽车充电桩主板产业链解析

新能源汽车充电桩主控制板&#xff0c;简称汽车充电桩主板&#xff0c;是充电桩设施的核心部件&#xff0c;主要负责控制充电桩的整体运行和管理充电过程。了解汽车充电桩主板的整体产业链是非常重要的&#xff0c;这可以帮助您更好地了解供应链、采购渠道以及行业发展趋势。 产…

java中 == 和 equals 有什么区别?

和 equals 在 Java 中有着不同的作用和使用场景&#xff1a; 是一个操作符&#xff0c;用于比较两个对象的引用是否相同。如果两个对象引用同一个内存地址&#xff0c;则 返回 true&#xff1b;否则返回 false。在比较基本数据类型时&#xff0c; 比较的是它们的值是否相等。…

抓住信号如此简单,WeTrade一个指标1分钟轻松解决

在交易中是不是有这样的困惑&#xff0c;没有清晰的计算逻辑还抓不住交易的信号&#xff0c;这样的投资者有福了&#xff0c;今天WeTrade众汇分享一个指标1分钟轻松解决这个困惑。 ROC全称Rate of Change&#xff0c;中文名为变动速度指标或变动率指标&#xff0c;它以百分比的…

Java就近原则和this关键字

Java 中的就近原则和 this 关键字有着密切的关系&#xff0c;特别是在处理成员变量与方法参数同名的情况下。就近原则指的是在同一作用域下&#xff0c;优先使用最近声明的变量或参数。 在 Java 中&#xff0c;如果一个方法的参数与类的成员变量同名&#xff0c;为了明确指示要…

大数据实验四-MapReduce编程实践

一&#xff0e;实验内容 MapReduce编程实践&#xff1a; 使用MapReduce实现多个文本文件中WordCount词频统计功能&#xff0c;实验编写Map处理逻辑、编写Reduce处理逻辑、编写main方法。 二&#xff0e;实验目的 1、通过实验掌握基本的MapReduce编程方法。 2、实现统计HDF…

【机器学习】数据探索(Data Exploration)---数据质量和数据特征分析

一、引言 在机器学习项目中&#xff0c;数据探索是至关重要的一步。它不仅是模型构建的基础&#xff0c;还是确保模型性能稳定、预测准确的关键。数据探索的过程中&#xff0c;数据质量和数据特征分析占据了核心地位。数据质量直接关系到模型能否从数据中提取有效信息&#xff…

Vue-Electron配置及踩坑

前言 大道至简。太复杂的教程不看。 本篇将记述我创建好Vue3项目之后&#xff0c;用Electron把页面呈现出来的整个过程。会记录一些踩坑。 首先&#xff0c;Electron官网可以参考。但是它只是作出了一个普通的html结构该如何用Electron呈现出来&#xff0c;vue的配置有一些变…

C 函数指针与回调函数

函数指针 函数指针是指向函数的指针变量。 通常我们说的指针变量是指向一个整型、字符型或数组等变量&#xff0c;而函数指针是指向函数。 函数指针可以像一般函数一样&#xff0c;用于调用函数、传递参数。 函数指针类型的声明&#xff1a; typedef int (*fun_ptr)(int,i…

OC分层渲染详解,OC分层渲染与云渲染区别

​OC分层渲染通过分层处理场景来提升渲染效率&#xff0c;而云渲染借助云服务器进行远程高性能渲染。主要差异在于OC分层渲染优化了本地渲染过程&#xff0c;云渲染则依靠云计算资源执行。 OC分层渲染是指什么 OC分层渲染&#xff0c;即Object Channel分层渲染&#xff0c;是一…

C语言运算符和表达式——赋值中的自动类型转换(精度损失问题)

目录 自动类型转换 数值精度损失 自动类型转换 在不同类型数据间赋值时&#xff0c;会发生自动类型转换 *取值范围大的类型 → 取值范围小的类型&#xff0c;通常是不安全的 *数值溢出&#xff08;Overflow&#xff09; *反之&#xff0c;一定都是安全的吗&#xff1f;…

fastlio2 给 interactive-slam 保存每帧的点云和每帧的里程计为单独的文件做后端回环优化和手动回环优化

为了给 interactive-slam 提供数据做后端回环优化和手动回环优化,需要保存每帧的点云和每帧的里程计为单独的文件,并且需要保存的名字为ros时间戳。 效果很好,比我自己写的手动回环模块好用 // This is an advanced implementation of the algorithm described in the // fo…

Golang和Java对比

其实我是Javaer转的Golang&#xff0c;我谈谈自己对Java和Golang的体会 我先讲讲我认为Golang的优点 1、Golang是一门新语言&#xff0c;相比于Java&#xff0c;他的生态要小很多&#xff0c;优点很明显&#xff0c;自由度高&#xff0c;学习成本低&#xff0c;能快速拉起一个…