NYIST 1238 最小换乘(第八届河南省程序设计大赛)
2016-05-05 20:25
246 查看
最少换乘
时间限制:2000 ms | 内存限制:65535 KB
难度:3
描述
欧洲某城是一个著名的旅游胜地,每年都有成千上万的人前来观光旅行。Dr. Kong决定利用暑假好好游览一番。。
年轻人旅游不怕辛苦,不怕劳累,只要费用低就行。但Dr. Kong年过半百,他希望乘坐BUS从住的宾馆到想去游览的景点,期间尽可量地少换乘车。
Dr. Kon买了一张旅游地图。他发现,市政部门为了方便游客,在各个旅游景点及宾馆,饭店等地方都设置了一些公交站并开通了一些单程线路。每条单程线路从某个公交站出发,依次途经若干个站,最终到达终点站。
但遗憾的是,从他住的宾馆所在站出发,有的景点可以直达,有的景点不能直达,则他可能要先乘某路BUS坐上几站,再下来换乘同一站的另一路BUS, 这样须经过几次换乘后才能到达要去的景点。
为了方便,假设对该城的所有公交站用1,2,……,N编号。Dr. Kong所在位置的编号为1,他将要去的景点编号为N。
请你帮助Dr. Kong寻找一个最优乘车方案,从住处到景点,中间换车的次数最少。
输入
第一行: K 表示有多少组测试数据。(2≤k≤8)
接下来对每组测试数据:
第1行: M N 表示有M条单程公交线路,共有N站。(1<=M<=100 1<N<=500)
第2~M+1行: 每行描述一路公交线路信息,从左至右按运行顺序依次给出了该线路上的所有站号,相邻两个站号之间用一个空格隔开。
输出
对于每组测试数据,输出一行,如果无法乘坐任何线路从住处到达景点,则输出"N0",否则输出最少换车次数,输出0表示不需换车可以直达。
样例输入
2
3 7
6 7
4 7 3 6
2 1 3 5
2 6
1 3 5
2 6 4 3
样例输出
2
NO
来源
第八届河南省程序设计大赛
题解:刚开始也是没做出来,参考别人的代码,写出来的,这道题主要在于输入的时候不知道每行有多少个数字,所以要用字符串输入,
然后将里面的数字取出来,在输入m,n之后一定要用getchar(),来接收其后的换行,然后利用Dijkstra算法求最短路就行了
代码:
时间限制:2000 ms | 内存限制:65535 KB
难度:3
描述
欧洲某城是一个著名的旅游胜地,每年都有成千上万的人前来观光旅行。Dr. Kong决定利用暑假好好游览一番。。
年轻人旅游不怕辛苦,不怕劳累,只要费用低就行。但Dr. Kong年过半百,他希望乘坐BUS从住的宾馆到想去游览的景点,期间尽可量地少换乘车。
Dr. Kon买了一张旅游地图。他发现,市政部门为了方便游客,在各个旅游景点及宾馆,饭店等地方都设置了一些公交站并开通了一些单程线路。每条单程线路从某个公交站出发,依次途经若干个站,最终到达终点站。
但遗憾的是,从他住的宾馆所在站出发,有的景点可以直达,有的景点不能直达,则他可能要先乘某路BUS坐上几站,再下来换乘同一站的另一路BUS, 这样须经过几次换乘后才能到达要去的景点。
为了方便,假设对该城的所有公交站用1,2,……,N编号。Dr. Kong所在位置的编号为1,他将要去的景点编号为N。
请你帮助Dr. Kong寻找一个最优乘车方案,从住处到景点,中间换车的次数最少。
输入
第一行: K 表示有多少组测试数据。(2≤k≤8)
接下来对每组测试数据:
第1行: M N 表示有M条单程公交线路,共有N站。(1<=M<=100 1<N<=500)
第2~M+1行: 每行描述一路公交线路信息,从左至右按运行顺序依次给出了该线路上的所有站号,相邻两个站号之间用一个空格隔开。
输出
对于每组测试数据,输出一行,如果无法乘坐任何线路从住处到达景点,则输出"N0",否则输出最少换车次数,输出0表示不需换车可以直达。
样例输入
2
3 7
6 7
4 7 3 6
2 1 3 5
2 6
1 3 5
2 6 4 3
样例输出
2
NO
来源
第八届河南省程序设计大赛
题解:刚开始也是没做出来,参考别人的代码,写出来的,这道题主要在于输入的时候不知道每行有多少个数字,所以要用字符串输入,
然后将里面的数字取出来,在输入m,n之后一定要用getchar(),来接收其后的换行,然后利用Dijkstra算法求最短路就行了
代码:
#include <iostream> #include <algorithm> #include <cstdio> #include <cstring> using namespace std; const int N=500+5; const int inf=0x3f3f3f3f; int map ; int n,m; ///Dijkstra算法 void dij() { int minn; int cost ,vis ; memset(vis,0,sizeof(vis));///初始化 for(int i=1; i<=n; i++) { cost[i]=map[1][i];///求1——N的最短路 } vis[1]=1; int u; for(int i=2; i<=n; i++) { minn=inf; for(int j=1; j<=n; j++) { if(!vis[j]&&minn>cost[j]) { minn=cost[j]; u=j; } } vis[u]=1; for(int j=1; j<=n; j++) { if(!vis[j]&&cost[j]>cost[u]+map[u][j]) { cost[j]=cost[u]+map[u][j]; } } } if(cost >=inf) printf("NO\n"); else printf("%d\n",cost -1);///让求的是经过了几站,不包括左后一个站。 } int main() { int t; scanf("%d",&t); while(t--) { int k; scanf("%d %d",&m,&n); getchar();///这个地方来接收换行 char s[2005]; int dis ; ///初始化:犯一个很脑残的错误就是i=N超过限定 for(int i=1; i<N; i++) { for(int j=1; j<N; j++) { if(i==j) map[i][j]=0; else map[i][j]=inf; } } for(int i=0; i<m; i++) { gets(s); k=0; for(int j=0; j<strlen(s); j++) { if(s[j]!=' ')///来获取每个数 { int sum=0; while(s[j]!=' '&&j<strlen(s))///这个数可能有多位N<=500; { sum=sum*10+(s[j]-'0'); j++; } dis[k++]=sum; } } for(int j=0; j<k; j++) { for(int v=j+1; v<k; v++) map[dis[j]][dis[v]]=1;///相邻的为1 } } ///Dijkstra算法 dij(); } return 0; }
相关文章推荐
- 技术博客HTML
- css position relative obsolution
- java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
- python PIL图像操作
- Android开发拖动条SeekBar的使用
- spark读取多个文件夹(嵌套)下的多个文件
- 解决RecycleView Adapter使用notifyItemRemoved造成Position混乱的问题。
- JAVA 内存泄露详解(原因、例子及解决)
- 软件工程(一)
- iOS多线程的初步研究(八)-- dispatch队列
- Java并发编程的艺术(上)
- hdu 1003 最大子序列的和
- 从小工到专家阅读笔记01
- ZOJ2588 Burning Bridges
- Objective-C method及相关方法分析
- Linux-21-配置win客户端和linux服务端上传下载文件(L004-03)
- 学习进度表
- iOS多线程的初步研究(七)-- dispatch对象
- PowerDesigner 把Comment写到name中 和把name写到Comment中 pd7以后版本可用
- NYOJ 541 最强DE 战斗力