1019: 好坑的电子地图(2015年中南大学研究生复试机试题 )

1019: 好坑的电子地图

时间限制: 1 Sec  内存限制: 128 MB
提交: 135  解决: 86
[提交][状态][讨论版]

题目描述

小明是今年参加复试的外校考生,他要去民主楼小礼堂签到。由于对中南大学校本部很不熟悉,小明找到了这边读书的好朋友鲁大师,不巧,鲁大师在忙着自由探索项目的结题工作,不能给他带路,只好给他发了一份半成品的电子地图。地图上只列出了校本部内的N个点,M条路,小明处于S点,民主楼小礼堂是T点。小明感谢鲁大师,当然只是在拿到地图的一瞬间,后面的情况让他知道这半成品到底有多坑。鲁大师制作的电子地图是带有语音提示功能的,但是在编号为奇数的点他要等1分钟才能告诉他具体怎么走,而在编号为偶数的点要等2分钟。现在告诉你地图的具体情况,小明想知道他能不能在A分钟内赶到民主楼小礼堂。

输入

输入数据有多组,每组占M+1行,第一行有5个数字N,M,S,T,A,接下来M行,每行三个数字u,v,t,代表每条路的两个顶点和步行时间。(输入数据保证不含重边0<N<M<1000)

输出

对于每组输入数据,输出一行,小明能在A分钟内赶到民主楼小礼堂输出YES和总共花费的时间,否则输出KENG

样例输入

4 3 1 4 10
1 2 1
3 2 2
3 4 3
5 4 2 4 7
1 2 5
5 4 2
3 5 1
2 3 1

样例输出

YES 10
KENG
 1 #include<iostream>
 2 /*本题实质上是一个对迪杰斯卡尔算法的改造,找出从起点开始的单源最短路径,
 3 并保存在数组中,最后通过查询终点在数组中的值来得出时间*/
 4 using namespace std;
 5 int N;
 6 int map[1005][1005];
 7 int dist[1005];
 8 bool isVisited[1005];
 9 int dijistral(int s, int t){
10     for (int i = 0; i < 1005; i++){//初始化数组,一开始所有的点的到源点时间为无限大
11         dist[i] = 100000;
12         isVisited[i] = false;
13     }
14     dist[s] = 0;//起点到起点为0
15     for (int j = 1; j <= N ; j++){
16         int min = 100000;
17         int index = 0;
18         int wait = 0;
19         for (int i = 1; i <= N; i++){//找出一个最短路径的点
20             if (!isVisited[i]&&dist[i] <= min){
21                 min = dist[i];
22                 index = i;
23             }
24         }
25         isVisited[index] = true;//将其访问
26         if (index % 2 == 0){//编号为奇数的点他要等1分钟才能告诉他具体怎么走
27                             //而在编号为偶数的点要等2分钟
28             wait = 2;
29         }
30         else{
31             wait = 1;
32         }
33         for (int i = 1; i <= N; i++){//将该点加入重新更新所有点到源点的时间
34             if (dist[i] > dist[index] + map[index][i]+wait){
35                 dist[i] = dist[index] + map[index][i]+wait;
36             }
37         }
38     }
39     return dist[t];
40 }
41 int main(){
42     int  M, S, T, A;
43     while (cin >> N >> M >> S >> T >> A){
44         for (int i = 0; i < 1005; i++){
45             for (int j = 0; j < 1005; j++){
46                 map[i][j] = 100000;
47             }
48         }
49         int s, t, v;
50         for (int i = 1; i <= M; i++){
51             cin >> s >> t >> v;
52             map[s][t] = v;
53             map[t][s] = v;
54         }
55         int time;
56         time = dijistral(S, T);
57         if (time > A){
58             cout << "KENG" << endl;
59         }
60         else{
61             cout << "YES" << " " << time << endl;
62         }
63     }
64     return 0;
65 }

猜你喜欢

转载自www.cnblogs.com/tangyimin/p/10543428.html
今日推荐