解题思路:

1.用拓扑排序判断给定的图是否是有向无环图(DAG)

在这个过程当中,对于入度为0的结点,在布尔数组中标记是初始结点

通过入队的结点个数是否等于总个数判断是不是DAG

注意:虽然有队列,但是不需要inq[]数组标记是否入队,当弹出一个元素时,再让计数加一

当一个结点出队,不要把对应的邻接向量清空,不然后面的迪杰斯特拉没法玩orz

2.不是DAG

好办,就分为可以作为起点的结点和不可以的两种情况输出

3.是DAG

加一个超级汇点,让这个汇点连接所有可以作为初始结点的结点,这样就转换成了单源最短路径问题,可以用Dijkstra解决。

但是注意这不是最朴素的Dijkstra

3.1 要记录每个结点的前置结点

然后用深度优先的方式递归输出路径

3.2 拥有第二标尺

完整代码如下(注:考试时没做出来,以下代码仅仅是通过了两个给出的test case)

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
#include<vector>
#include<queue>using namespace std;const int maxn = 1010;
const int inf = 1000000000;//即10^9 struct Node{int v;//vertexint s;//scoreint d;//dollar Node(int _v,int _s,int _d):v(_v),s(_s),d(_d){}
};vector<Node> Adj[maxn];int vNum,eNum,qNum,inDegree[maxn] = {0},isStart[maxn] = {0};bool topologicalSort(){queue<int> Q;int num = 0;//入队的总结点数 for(int i=0;i<vNum;i++){if(inDegree[i]==0){Q.push(i);isStart[i] = 1;//i是起始节点 }}while(!Q.empty()){int v = Q.front();Q.pop();for(int i=0;i<Adj[v].size();i++){int u = Adj[v][i].v;inDegree[u] --;if(inDegree[u]==0){Q.push(u);}}num ++;
//      Adj[v].clear();     }if(num==vNum)return true;else return false;
}int dis[maxn];
int vou[maxn];int pre[maxn]; void Dijkstra(){int s = vNum;bool vis[maxn] = {0};fill(dis,dis+vNum,inf);dis[s] = 0;fill(vou,vou+vNum,0);for(int i=0;i<=vNum;i++){//每次点亮一个结点 //找当前未点亮结点中距离最近的int v = -1,MIN = inf;for(int j=0;j<=vNum;j++){//到这一步出现了段错误 if(vis[j]==false&&dis[j]<MIN){MIN = dis[j];v = j;}}if(v==-1)return;vis[v] = true;for(int j=0;j<Adj[v].size();j++){int u = Adj[v][j].v;if(dis[u]>dis[v]+Adj[v][j].s&&vis[u]==false){dis[u] = dis[v]+Adj[v][j].s;vou[u] = vou[v]+Adj[v][j].d;pre[u] = v;}else if(dis[u]==dis[v]+Adj[v][j].s&&vou[u]<vou[v]+Adj[v][j].d&&vis[u]==false){vou[u] = vou[v]+Adj[v][j].d;pre[u] = v;}} } }void DFS(int u){//s是起点,u是终点 if(u==vNum){
//      printf("%d",u);return;}DFS(pre[u]);if(isStart[u]!=1)printf("->");printf("%d",u);
}int main(){scanf("%d %d",&vNum,&eNum);int v1,v2,s,d;for(int i=0;i<eNum;i++){scanf("%d %d %d %d",&v1,&v2,&s,&d);inDegree[v2]++;Node node = Node(v2,s,d);Adj[v1].push_back(node);}bool tsSuccess = topologicalSort();//拓扑排序成功否if(tsSuccess){//增加一个点,编号为vNum,作为超级源点for(int i=0;i<vNum;i++){if(isStart[i]==1){inDegree[i]++;Node node = Node(i,0,0);Adj[vNum].push_back(node);}} printf("Okay.\n");Dijkstra();scanf("%d",&qNum);while(qNum--){int u;//destinationscanf("%d",&u);if(isStart[u]==1){printf("You may take test %d directly.\n",u);}else{DFS(u);printf("\n");}  }}else{printf("Impossible.\n");scanf("%d",&qNum);while(qNum--){int u;scanf("%d",&u);if(isStart[u]==1)printf("You may take test %d directly.\n",u);else printf("Error.\n");}     }return 0;
}

PAT(甲级)2020年秋季考试 7-4 Professional Ability Test相关推荐

  1. 【PAT】2020年秋季考试划水准备贴

    1.环境 1.时间 PAT一年有三次考试,春季(2-3),秋季(8-9)和冬季(11-12) 本次考试时间: 2020/09/05 13:30:00 2.地点 PAT在非浙江地区(比如上海),往往都只 ...

  2. 记PAT 甲级 2021年 秋季考试 经验总结、线上考试细节、考场题解

    1.简单回顾 今天下午考完了秋季的考试,最终得了97分,第一题扣了3分,非常遗憾.还有一个多小时的时候就已经97了,回来和第一题的剩余3分周旋到最后,没能发现问题所在,不停考虑各种,我觉得可能是陷在已 ...

  3. 【PAT甲级最新题解】PAT甲级2020.7月春季考试满分题解(附代码)

    写在前面:这次题目虽然大多数是模拟题且不算难,但是题面其实不算友好,不少同学因为题目描述而错失满分. A: 题意:给定一个数字串,问每一个前缀串是否是素数. 模拟题不多解释. #include< ...

  4. 【PAT】2020年春季考试划水准备贴

    1.起因 因为之前NOIP凉了,所以算法竞赛没拿到任何加分加好感项,感觉白敲了三年代码 偶然间看到这个而且感觉挺简单,就试试三位一体有没有用,或者暑假实习,再不济反正把乙考了大学在水甲级和顶级凑一凑考 ...

  5. 【PAT】2020年春季考试乙级题目、答案、摸鱼、游记、93分

    T1 对称日 (15分) 7-1 对称日 (15分) 央视新闻发了一条微博,指出 2020 年有个罕见的"对称日",即 2020 年 2 月 2 日,按照 年年年年月月日日 格式组 ...

  6. 2019秋季PAT甲级考试总结:努力+策略+运气

    鉴于这两天有很多网友联系我问这次考试的题解,所以我干脆就花点时间把C++题解整理出来了,见文末 经过一两个月的备战PAT,在今天终于画上了一个圆满的句号,取得了满分的成绩. 我是在南京的金陵科技学院考 ...

  7. 2019 PAT甲级秋季考试总结

    因为要考研浙大软院,所以考个PAT甲级抵机试是很好的!而且之前天梯赛金奖发了150的代金券,让原价256的考试看起来也没那么贵了~于是很早就报名啦!(但是很后悔3月份那场没报,不然就可以更早轻松一点了 ...

  8. 2019年秋季PAT甲级考试记录、经验总结

    在武汉科技大学黄家湖校区考的,非常偏远,在很荒僻的地方,荒僻到公交都要3元的地方(开玩笑~).我去的路上大概花了两个小时,12点半到的,武科机房软.硬件条件很好,跟官网的要求一样,绝对能够满足各种常用 ...

  9. 2020秋季甲级PAT 7-4 Professional Ability Test (30 分)

    7-4 Professional Ability Test (30 分) Professional Ability Test (PAT) consists of several series of s ...

最新文章

  1. Registry Release Traces 版本功能迭代和 issue bugfix
  2. [tomcat7源码学习]结束Bootstrap进入Catalina
  3. C语言多维数组做函数参数技术推演
  4. dhrystone测试结果_RTThread软件包可以对MCU进行性能测试,跑一个试试!
  5. 开启云原生 MOSN 新篇章 — 融合 Envoy 和 Golang 生态
  6. 多项式拟合lm_R语言多项式回归
  7. 如何注释python中html,Python在HTML中提取带注释的代码,python,html,被
  8. 文件I/O实践(3) --文件共享与fcntl
  9. c# 获取键盘的输入
  10. 第 0001 天:聊聊成长型思维模式者
  11. hightcharts 3d 堆积图下钻
  12. 基于.net技术的 Rss 订阅开发
  13. gds文件 导出_RSoft CAD新的导入/导出GDS档案方法
  14. 前端汉字encode_js编码转码中文
  15. IT行业里哪些岗位热门又高薪?
  16. oracle alter database,alter database操作
  17. 日常(魔鬼本鬼又来了)
  18. MATLAB SCI论文绘图及绘图窗口大小设置
  19. 【项目实战】传智健康
  20. 宇视钉钉智联门禁能否关闭测温?

热门文章

  1. Ubuntu 上创建常用磁盘阵列
  2. 解决jupyter中无自己创建的虚拟环境
  3. 你是否对它有一种责任感
  4. 项目管理深入理解08--成本管理
  5. DoubleViewPager
  6. 小鱼提问1 类中嵌套public修饰的枚举,外部访问的时候却只能Class.Enum这样访问,这是为何?...
  7. CCTouchDispatcher sharedDispatcher 方法过期
  8. 提权巧用RAR.EXE
  9. 关于服务器启动慢的问题
  10. 出色管理者的时间管理