题目描述
你拜托了jxh聚聚安排自己和lhy聚聚见一面,他告诉你下午三点在记忆博物馆就可以见到lhy聚聚了。 午觉过后,你看了一眼时间,惊觉现在已经下午一点了。你立刻使用魔法传送到了地铁站(不知为什么路上一辆出租车都没有呢),但你并不知道记忆博物馆在哪里,也并不知道怎么过去,于是你选择向工作人员求助。
工作人员告诉你:记忆博物馆只能通过魔法列车(魔法列车一共有12个站点,每条运行的魔法列车只有起点和终点且为单向行驶,不会停靠在别的站点,随时都有车次)到达,你现在所处的位置为1号站点,而记忆博物馆在n号站点(2<=n<=12),并且给了你目前开通的t(1<=t<=12)条魔法列车线路及其运行一次所用的时间。机智的你发现,对于每个站点,最多只能成为一次起点。现在时间仍是下午一点钟,你要判断,自己是否能按时抵达记忆博物馆。
输入
第一行输入两个整数n和t。
随后t行,每行输入三个整数a, b, x,分别表示该条列车线路的起点、终点和耗时(单位为分钟)。
输出
两行,如果能按时抵达输出"yes"(不含引号,下同),并在第二行输出最少的用时(整数,单位分钟,下同)。否则输出"No",如果能够抵达在第二行输出最少用时,如果无法抵达则输出"0"。
样例输入 Copy
4 3 1 3 20 2 4 30 3 2 10
样例输出 Copy
yes 60
提示
2 <= n <= 12,
1 <= t <= 12,
1 <= a,b <= 12, a != b,
1 <= x <= 120.
问题分析:
使用结构体定义车次就可以很好的储存一辆车的数据,同时将结构体数组的起始站与其下标相联系起来就能够方便的使用结构体,然后我们开始查找有没有以一号站为起始点的车次,如果没有我必然无法按时到达记忆博物馆,如果有一号车次则从这一车次开始发车然后依次走向下一车次,直到到达博物馆,在此过程中如果碰到了循环车站如1->3,3->2,2->3这种必然会导致车次计数器的值大于总车次的值,此时必然无法到达。这一车次的终点应为下一车次的起点就转向了下一车次,直到车次无法指向下一车次。
代码实现
#include<stdio.h>
struct station{
int q;
int z;
int x;
};
int main(){
struct station che[20];
int n,t,flag=0;
int a1,a2,a3;
scanf("%d %d",&n,&t);
for(int i=0;i<20;i++){//先将每一车站的终点与起点赋值为0表示并不存在
che[i].z=0;
che[i].q=0;
}
for(int i=1;i<=t;i++){//将以a1为起始站的各项值赋为读入值
scanf("%d %d %d",&a1,&a2,&a3);//将起始站与数组下标联系起来
che[a1].q=a1;
che[a1].z=a2;
che[a1].x=a3;
}
int sum=0;//用sum计时
int m=1,i;//m表示从第一号站开始
if(che[m].q==0){//如果一号站不存在则必然无法到达
printf("No\n");
printf("0");
return 0;
}
for( i=1;i<=t;i++){
if(che[m].z==n){//如果这一号站能到达终点则跳出循环
sum+=che[m].x;
break;
}else{
sum+=che[m].x;//否则进入下一站
m=che[m].z;//m为起始站的下标这一操作是让发车车次进入下一车站
if(che[m].z==0){//如果为0说明这一车站不存在必然无法到达用表示量flag记录
flag=1;
break;
}
}
}
if(sum<=120&&flag!=1&&i<=t){//i<=t说明没有遇到循环的车站,flag不等于1说明中间没遇到间断的
printf("yes\n");
printf("%d",sum);
}else if(sum>120&&flag!=1&&i<=t){
printf("No\n");
printf("%d",sum);
}else if(flag==1||i>t){
printf("No\n");
printf("0");
}
return 0;
}
提交结果