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 }