uva 10801(dijkstra)

本文介绍了一种解决特定场景下电梯移动最短时间问题的方法。通过对楼层进行拆分并建立图模型,利用Dijkstra算法求解从起点到指定楼层的最短路径。此方法考虑了不同电梯间的转换时间和各电梯的移动速度。

题意:一个人在大楼的0楼,大楼最多到99层,有n部电梯每部电梯有可到达的楼层每个电梯移动一层的时间为T[i]秒换电梯的时间为60秒,给你一个楼层问你电梯到这个楼层的最短路径。

思路:很容易看出是一个最短路问题,关键在于如何建图,首先我们分析一下我们很容易想到把楼层当作点把时间当左边,但是有一个问题由于它涉及楼层中换电梯所以这样做的话我们就无法计算换电梯的时间,所以我的方法是把一个楼层拆成n个点(这样做的前提是在这道题中n比较小<=5)分别表示从哪一个电梯下来的。然后再把相同楼层的点之间加一条长度为60的边。这样再通过执行n次Dijkstra算法去最小值得出答案。

代码如下:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <algorithm>
 6 #include <utility>
 7 #include <vector>
 8 #include <queue>
 9 #include <stack>
10 #define INF 500001
11 #define LEN 610
12 using namespace std;
13 
14 typedef pair<int, int> pii;
15 vector<pii> Map[LEN];
16 int dis[LEN];
17 
18 void Dijkstra(int vex){
19     priority_queue<pii, vector<pii>, greater<pii> > q;
20     int vis[LEN] = {0};
21     for(int i=0; i<LEN; i++) dis[i] = (i==vex?0:INF);
22     q.push(make_pair(dis[vex], vex));
23     while(!q.empty()){
24         pii nv = q.top(); q.pop();
25         int x = nv.second;
26         if(vis[x]) continue;
27         vis[x] = 1;
28         for(vector<pii>::iterator it = Map[x].begin(); it!=Map[x].end(); ++it){
29             int y = it->first, v = it->second;
30             if(dis[y]>dis[x]+v){
31                 dis[y] = dis[x]+v;
32                 q.push(make_pair(dis[y], y));
33             }
34         }
35     }
36 }
37 
38 int main()
39 {
40 //    freopen("in.txt", "r", stdin);
41 
42     int n, K, sp[LEN], avi[LEN];
43     while(scanf("%d%d", &n, &K)!=EOF){
44         for(int i=0; i<LEN; i++)Map[i].clear();
45         for(int i=0; i<n; i++){
46             scanf("%d", &sp[i]);
47         }
48         for(int i=0; i<n; i++){
49             int top = 0;
50             while(scanf("%d", &avi[top++])!=EOF)
51                 if(getchar()=='\n')break;
52             int idx = i*100;
53             for(int j=0; j<top; j++){
54                 for(int k=j+1; k<top; k++){
55                     Map[idx+avi[j]].push_back(make_pair(idx+avi[k], (avi[k]-avi[j])*sp[i]));
56                     Map[idx+avi[k]].push_back(make_pair(idx+avi[j], (avi[k]-avi[j])*sp[i]));
57                 }
58             }
59         }
60         for(int i=0; i<100; i++){
61             for(int j=0; j<n; j++){
62                 for(int k=0; k<n; k++){
63                     Map[j*100+i].push_back(make_pair(k*100+i, 60));
64                     Map[k*100+i].push_back(make_pair(j*100+i, 60));
65                 }
66             }
67         }
68         int ans = INF;
69         for(int i=0; i<n; i++){
70             Dijkstra(0+i*100);
71             for(int j=0; j<n; j++) ans = min(ans, dis[K+j*100]);
72         }
73         if(ans==INF) printf("IMPOSSIBLE\n");
74         else printf("%d\n", ans);
75     }
76     return 0;
77 }
View Code

 

转载于:https://www.cnblogs.com/shu-xiaohao/p/3466217.html

标题基于Python的自主学习系统后端设计与实现AI更换标题第1章引言介绍自主学习系统的研究背景、意义、现状以及本文的研究方法和创新点。1.1研究背景与意义阐述自主学习系统在教育技术领域的重要性和应用价值。1.2国内外研究现状分析国内外在自主学习系统后端技术方面的研究进展。1.3研究方法与创新点概述本文采用Python技术栈的设计方法和系统创新点。第2章相关理论与技术总结自主学习系统后端开发的相关理论和技术基础。2.1自主学习系统理论阐述自主学习系统的定义、特征和理论基础。2.2Python后端技术栈介绍DjangoFlask等Python后端框架及其适用场景。2.3数据库技术讨论关系型和非关系型数据库在系统中的应用方案。第3章系统设计与实现详细介绍自主学习系统后端的设计方案和实现过程。3.1系统架构设计提出基于微服务的系统架构设计方案。3.2核心模块设计详细说明用户管理、学习资源管理、进度跟踪等核心模块设计。3.3关键技术实现阐述个性化推荐算法、学习行为分析等关键技术的实现。第4章系统测试与评估对系统进行功能测试和性能评估。4.1测试环境与方法介绍测试环境配置和采用的测试方法。4.2功能测试结果展示各功能模块的测试结果和题修复情况。4.3性能评估分析分析系统在高并发等场景下的性能表现。第5章结论与展望总结研究成果并提出未来改进方向。5.1研究结论概括系统设计的主要成果和技术创新。5.2未来展望指出系统局限性并提出后续优化方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值