博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[题解]公共汽车
阅读量:6370 次
发布时间:2019-06-23

本文共 3051 字,大约阅读时间需要 10 分钟。

版权说明:来自 石门ss学校 Guohao OJ ,禁止转载

题目描述

路人丁成为了一名新公交车司机,每个司机都有一张牌子,牌子的正面写了拥有这个牌子的司机开的线路号,另外一面随便写了一个号码。但是路人丁的牌子两面写的都不是自己开的线路号。所以他决定跟其他人换,当然,所有的司机都只有当路人丁手里的牌子上的某面写了自己的线路号时才愿意跟他换。所以路人丁想知道自己至少要换几次牌子才能换到一张写有自己线路号的牌子。

输入输出格式

输入格式:

第一行包括一个整数K(K≤1000),表示车的数量(新车除外)。

这些车的编号依次从1到K。接下来的K行,每行包括此车对应的线路号和牌子另一面的号码(long long范围的数字)。最后一行是安排路人丁开的公交车线路号以及给他的牌子上的号码。

输出格式:

第一行为最少交换的次数M。

接下来的M行顺序输出要交换牌子的车的编号。如果没有方案,则输出“IMPOSSIBLE”。

输入输出样例

输入样例:

48 55 47 41 54 1 8
输出样例:
242

题目分析

通过题目分析我们可以发现这表面上是一道交换类题,但是如果沿着这个思路走时间复杂度让代码无法承受(至少对于普及组而言),我们发现一旦与一个人交换牌子就不需要再进行交换(因为如果有更优情况,为什么不在之前与他人交换呢?)

交换后我们继承了被交换者的牌子,那我们可以把被继承着当做自己,这就是一个 dijstra 的模板题了,另外要求输出路径,并且要求 字典序  ,我们可以在求最短路时,顺便拿一个数组记录父节点,最后再反向输出即可。

 

代码

1 #include
2 #include
3 #include
4 using namespace std; 5 6 typedef long long LL; 7 const int Max_N=1e3+5; 8 const int Inf=(1<<31)-1; 9 10 int n;11 LL Need;12 LL NumF[Max_N],NumB[Max_N];13 14 bool vis[Max_N];15 LL dis[Max_N],Fa[Max_N],ea_Fa[Max_N];//dijstra16 17 bool acc(LL A,LL B,LL C)18 {19 if(A==C||B==C) return 1;20 return 0; 21 }22 23 void dijstra(int st)24 {25 register int i,l;26 dis[1]=0;27 for(l=1;l<=n;l++){28 int p=-1,Min=Inf;29 for(i=1;i<=n+1;i++)30 if(!vis[i]&&Min>dis[i])31 Min=dis[i],p=i;32 if(p==-1||vis[p]) continue;33 vis[p]=1;34 for(i=1;i<=n+1;i++)35 if(!vis[i]&&acc(NumF[p],NumB[p],NumF[i])){36 if(dis[i]>dis[p]+1){37 dis[i]=dis[p]+1;38 Fa[i]=p;39 if(p^1)40 ea_Fa[i]=ea_Fa[p];41 else42 ea_Fa[i]=i;43 }44 else if(dis[i]==dis[p]+1)45 if(ea_Fa[i]>ea_Fa[p])46 ea_Fa[i]=ea_Fa[p],Fa[i]=p;47 }48 }49 return ;50 }51 52 int main()53 { 54 scanf("%d",&n);55 register int i,j;56 for(i=1;i<=n+1;i++) 57 dis[i]=Inf;58 for(i=1;i<=n;i++)59 scanf("%lld%lld",&NumF[i+1],&NumB[i+1]);60 scanf("%lld%lld%lld",&Need,&NumF[1],&NumB[1]);61 // 这里是将自己装入第一个位置,方便进行最短路操作62 dijstra(1);63 int p=-1,early=Inf;64 LL res=Inf;65 for(i=2;i<=n+1;i++)66 if(((early>ea_Fa[i]&&res==dis[i])||res>dis[i])&&(Need==NumF[i]||Need==NumB[i])){67 res=dis[i];68 p=i;69 early=ea_Fa[i];70 }71 // 寻找最优情况72 if(p>0&&res^Inf){73 printf("%lld\n",res);74 vector
Ans;75 while(Fa[p])76 Ans.push_back(p),p=Fa[p];77 for(i=Ans.size()-1;i>=0;i--)78 printf("%lld\n",Ans[i]-1);79 //反向输出80 }81 else{82 printf("IMPOSSIBLE");83 // 不存在路到达84 }85 return 0;86 }
View Code

 

写在最后的话:

题解仅供思路,要想成为 dalao ,请学会并尽量会做到教他人甚至自己写题解。

博主(目前)是一名初二蒟蒻,如有问题还请大家指出,一起交流学习!

Happy every day!        ——2019.4.11

 

转载于:https://www.cnblogs.com/lihepei/p/10756097.html

你可能感兴趣的文章
javascript中的内存管理和垃圾回收
查看>>
Hbase java 常见操作
查看>>
Python网络编程——协程
查看>>
laravel中短信发送验证码的实现方法
查看>>
10月25日云栖精选夜读 | 机器学习高质量数据集大合辑
查看>>
fastjson实例
查看>>
服务器架构
查看>>
【Android学习】Android studio 使用AIDL
查看>>
【20160924】GOCVHelper MFC增强算法(2)
查看>>
阿里云安全肖力:云的六大安全基因助力企业构建智能化安全体系
查看>>
豆瓣阅读报告生成器
查看>>
building with Gulp
查看>>
首个不怕被盗取生物特征的生物识别技术问世
查看>>
Java虚拟机管理的内存运行时数据区域解释
查看>>
OpenPOWER全产业链协同打通大数据Hadoop的再创新轨道
查看>>
阿里巴巴并购安全公司翰海源
查看>>
连云存储魔力象限都进不了,就别提三年之内中国第一了吧!
查看>>
为什么“私有云”计算值得考虑
查看>>
《OpenACC并行程序设计:性能优化实践指南》一 2.3 描述数据移动
查看>>
《数据虚拟化:商务智能系统的数据架构与管理》一 1.7 数据虚拟化的技术优势...
查看>>