当前位置: 首页 > 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.cnnetsun.cn/news/51594.html

相关文章:

  • 多目标蜣螂优化算法NSDBO:微电网多目标优化调度的利器
  • 本研究基于分形纤维丛统一场论,构建了黑洞时空的几何模型,揭示了奇点消解、霍金辐射修正及信息守恒的新机制。该模型的优势在于将宏观时空的广义相对论效应与微观量子的分形特性实现了有机融合。
  • 好写作AI语言侦探:你的论文严谨性“隐形把关人”
  • 解放双手!钉钉智能打卡神器完全上手手册
  • DMXAPI全球模型API调用完全指南:从入门到精通
  • 告别“翻墙“烦恼:DMXAPI让Gemini-3-pro-thinking调用快如闪电
  • leetcode 744. Find Smallest Letter Greater Than Target 寻找比目标字母大的最小字母-耗时100%
  • Home Assistant通知系统:3步打造智能家居提醒中心
  • 学Simulink——机器人轨迹跟踪场景实例:基于Simulink的永磁同步电机笛卡尔空间圆弧轨迹跟踪仿真
  • 【毕业设计/课程设计】基于Java的高校学科竞赛平台的设计与实现/源码+论文+PPT+数据
  • java计算机毕业设计摄影爱好者交流平台 基于SpringBoot的影像作品分享与互动社区 摄影圈层社交与作品点评一体化平台
  • “AI 写的论文,参考文献靠谱吗?”—— 虎贲等考 AI 给出答案:所有参考文献均来自知网、维普,全程可查、合规可溯
  • 2025年AI降重工具深度评测:10款零风险智能改写方案(askpaper与aibiiye实测)
  • java计算机毕业设计社团管理系统 高校学生社团数字化运营平台 校园社团协同管理与活动发布系统
  • 缩短启动时间的定制支持成为采用关键——持续选用Silex希来科无线模块逾十年~
  • NAT技术和链路层概述
  • 数据库约束
  • Blender主题定制终极指南:如何快速打造个性化界面
  • 【无标题】web第三周
  • Holo1.5开源:小模型颠覆UI智能交互,企业级AI代理成本骤降80%
  • 如何快速掌握umy-ui:面向Vue开发者的终极性能优化指南
  • 【流程】——若依项目前后端打包发布到服务器
  • Velero压缩引擎深度解析:从架构原理到实战调优
  • DolphinScheduler 2025技术生态:从零开始掌握分布式调度系统
  • 5大WebGPU错误终极解决方案:让WebLLM硬件加速不再失败
  • 一步成图革命:OpenAI一致性模型如何重塑2025生成式AI生态
  • GDevelop游戏引擎终极指南:从零基础到专业开发全流程
  • 生成对抗网络创建测试数据
  • java计算机毕业设计社区医疗服务管理系统 街区智慧健康服务管理平台 基层医疗信息综合管理系统
  • S7-1500TF + S210 绝对齿轮同步:双轴梯形图程序解析