当前位置: 首页 > news >正文

PAT 1175 Professional Ability Test




这一题的大意PAT考试有一些等级考试在通过某些等级考试后才能去做另一些等级考试,可以把题目要求抽象成给出一个图,给出的这个图首先要判断它是不是有向无环图图,也就是题目中的
A plan is NOT consistent if there exists some test T so that T is a prerequisite of itself.
如果不是,题目上要求了不是的只能输出没有前提条件(入度为0)的等级考试:
You may take test x directly.,
其他一律输出error,(可能其他等级考试不在环中,但是它有前提条件(入度不为0)也输出error)。
如果是有向无环图,按题目要求先输出Okay.
如果是入度为0,输出:You may take test x directly.
如果入度不为0,我们来找所需分数最低,当分数一样时钱最多的路径。很明显dijkstra。
但题目上入度为0的点可能不止一个,而dijkstra是解决单源最短路的,我们可以再建一个超级源点,来把入度为0的点都被这个超级源点所指向,超级源点到这些入度为0的店的分数和钱都为0,这样我们就可以统一起来,只需要找从超级源点到各个点的最短路即可。
判断有无环,用拓扑排序的方式:

boolishuan(){queue<int>q;unordered_map<int,int>temp;temp=mp;for(inti=0;i<N;i++){if(temp[i]==0){q.push(i);}}intcnt=0;while(!q.empty()){intx=q.front();if(temp[x]==0){cnt++;}q.pop();for(inti=head[x];i!=-1;i=e[i].next){intu=e[i].to;temp[u]--;if(temp[u]==0){q.push(u);}}}if(cnt<N){returnfalse;}else{returntrue;}}

跑dijkstra算法,我习惯于用链式前向星存图+堆优化dijkstra。
但这一题需要注意的是,我们要在找分数最小的基础上,还要找钱最多的,如果通过保存每一条分数最小的最短路径,然后再用DFS来遍历枚举出钱最多的那一条边无疑是非常麻烦的,而且比超时,我们这里选择对堆的排序规则进行改造,使得它每次的最小值是分数最小的前提下,钱最多。

structstate{ints;intd;intu;//表示某一个点``};structcmp{booloperator()(conststate&a,conststate&b)const{if(a.s>b.s){returntrue;}elseif(a.s==b.s){if(a.d>b.d){returntrue;}else{returnfalse;}}else{returnfalse;}}};priority_queue<state,vector<state>,cmp>q;

这样就完美解决了。
我们只需要按照正常的方法跑dijkstra即可。
注意要用一个 int pre[1005]来保存前驱节点。
最后只需要逆序输出这些节点即可。
完整代码如下:

#include<bits/stdc++.h>#include<iostream>usingnamespacestd;//A是B的前置要求必须通过A不少于S才有资格去B//同时通过A不少于S将会接收到一个代金卷D元可以去B使用//同时PAT被设计人们可以有不同的计划,A计划不包含T因为T是它的前置要求//你的工作是去测试每一个计划并且辨别它是包含哪一个点//同时找到最简单的方式带有最小的S去得到一些测试的资格//如果最简单的方式不止一种找到一个可以赢得带进卷最多的intN;//测试的总共数量intM;//前置条件关系unordered_map<int,int>mp;structnode{intto;intnext;ints;intd;}e[1000005];structstate{ints;intd;intu;};structcmp{booloperator()(conststate&a,conststate&b)const{if(a.s>b.s){returntrue;}elseif(a.s==b.s){if(a.d>b.d){returntrue;}else{returnfalse;}}else{returnfalse;}}};intcut;inthead[1005];voidadd(intx,inty,ints,intd){e[cut].next=head[x];e[cut].to=y;e[cut].s=s;e[cut].d=d;head[x]=cut;cut++;}boolishuan(){queue<int>q;unordered_map<int,int>temp;temp=mp;for(inti=0;i<N;i++){if(temp[i]==0){q.push(i);}}intcnt=0;while(!q.empty()){intx=q.front();if(temp[x]==0){cnt++;}q.pop();for(inti=head[x];i!=-1;i=e[i].next){intu=e[i].to;temp[u]--;if(temp[u]==0){q.push(u);}}}if(cnt<N){returnfalse;}else{returntrue;}}intflag[1005];intdists[1005];priority_queue<state,vector<state>,cmp>q;intpre[1005];intdistd[1005];voiddijkstra(ints){memset(dists,0x3f,sizeof(dists));for(inti=0;i<1005;i++){distd[i]=-505;}memset(flag,0,sizeof(flag));dists[s]=0;distd[s]=0;q.push({dists[s],distd[s],s});while(!q.empty()){state z=q.top();q.pop();intu=z.u;if(flag[u]==0){flag[u]=1;for(inti=head[u];i!=-1;i=e[i].next){intv=e[i].to;intns=dists[u]+e[i].s;intnd=distd[u]+e[i].d;if(ns<dists[v]||(ns==dists[v]&&nd>distd[v])){dists[v]=ns;distd[v]=nd;pre[v]=u;q.push({ns,nd,v});}}}else{continue;}}}intmain(){cin>>N>>M;memset(head,-1,sizeof(head));for(inti=0;i<M;i++){intx;inty;ints;intd;cin>>x>>y>>s>>d;mp[y]++;add(x,y,s,d);}boolf=ishuan();if(f==1){cout<<"Okay."<<endl;//构造超级源点for(inti=0;i<N;i++){if(mp[i]==0){add(1004,i,0,0);}}//说明是入度为0的点dijkstra(1004);}else{cout<<"Impossible."<<endl;}intK;cin>>K;for(inti=0;i<K;i++){intx;cin>>x;if(mp[x]==0){cout<<"You may take test "<<x<<" directly."<<endl;}elseif(mp[x]!=0&&f==0){cout<<"Error."<<endl;}elseif(mp[x]!=0&&f==1){inttem=x;vector<int>ans;ans.push_back(tem);while(pre[tem]!=1004){ans.push_back(pre[tem]);tem=pre[tem];}for(inti=ans.size()-1;i>=0;i--){if(i!=ans.size()-1){cout<<"->"<<ans[i];}else{cout<<ans[i];}}cout<<endl;}//找符合条件的路径}return0;}

注意:distd 也就是钱要找最大值,我们需要把它初始化为负数。
其他细节其他题目也常有涉及,不再赘述。

http://www.jsqmd.com/news/88186/

相关文章:

  • 22、Linux系统:备份、安装与管理全攻略
  • 缓存高可用架构-写缓存 - 实践
  • 多目标蜣螂优化算法NSDBO:微电网多目标优化调度的利器
  • 经典Agent架构实战之工具使用 (Tool Use)
  • 2025年市场上有实力的下水道疏通公司推荐,评价高的下水道疏通哪家强永邦环卫显著提升服务 - 品牌推荐师
  • 字符串移位包含问题与删除单词后缀问题
  • 本研究基于分形纤维丛统一场论,构建了黑洞时空的几何模型,揭示了奇点消解、霍金辐射修正及信息守恒的新机制。该模型的优势在于将宏观时空的广义相对论效应与微观量子的分形特性实现了有机融合。
  • 【JavaWeb】HttpServletRequest_获取请求行和请求头
  • [Web自动化] HTML表格标签
  • 21、正则表达式全解析:从基础到高级应用
  • 好写作AI“新手友好模式”:如何让学术小白自信写出第一篇论文?
  • 23、Linux 文本处理工具全解析
  • DeepSeek-Prover-V2:重新定义AI数学推理的黄金标准
  • DeepSeek-Prover-V2:重新定义AI数学推理的黄金标准
  • 术语俗话 --- 什么是抄板
  • 好写作AI语言侦探:你的论文严谨性“隐形把关人”
  • CSS 布局全指南:从基础到进阶,掌握前端页面排版核心
  • 剪映 6.0.1:免费解锁 VIP 功能,剪辑创作性价比之选
  • 【火语言RPA实战案例】根据ISBN 编码批量查询孔夫子书籍信息,自动导出本地 Excel(附完整脚本) - 实践
  • 验证码识别系统
  • 实力优选!北京 / 天津商场商业美陈活动策划设计制作公司清单
  • GitHub图片管理终极指南:从概念到实践
  • Day1 1.A+B问题I -卡码网C++基础课
  • CubiFS分布式存储系统全面贡献指南:从入门到核心开发
  • “AI 写的论文,参考文献靠谱吗?”—— 虎贲等考 AI 给出答案:所有参考文献均来自知网、维普,全程可查、合规可溯
  • 文科论文发表权威参考:八大期刊评价体系与AI工具优化指南
  • 【干货】5 个神级 Prompt 助你 3 分钟读懂顶会论文
  • 告别低效写作:6款平板论文工具让你的研究事半功倍
  • 缩短启动时间的定制支持成为采用关键——持续选用Silex希来科无线模块逾十年~
  • MLflow跨国团队协作实战:打破语言壁垒的完整解决方案