uva 10801(dijkstra)
2013-12-09 22:00
381 查看
题意:一个人在大楼的0楼,大楼最多到99层,有n部电梯每部电梯有可到达的楼层每个电梯移动一层的时间为T[i]秒换电梯的时间为60秒,给你一个楼层问你电梯到这个楼层的最短路径。
思路:很容易看出是一个最短路问题,关键在于如何建图,首先我们分析一下我们很容易想到把楼层当作点把时间当左边,但是有一个问题由于它涉及楼层中换电梯所以这样做的话我们就无法计算换电梯的时间,所以我的方法是把一个楼层拆成n个点(这样做的前提是在这道题中n比较小<=5)分别表示从哪一个电梯下来的。然后再把相同楼层的点之间加一条长度为60的边。这样再通过执行n次Dijkstra算法去最小值得出答案。
代码如下:
View Code
思路:很容易看出是一个最短路问题,关键在于如何建图,首先我们分析一下我们很容易想到把楼层当作点把时间当左边,但是有一个问题由于它涉及楼层中换电梯所以这样做的话我们就无法计算换电梯的时间,所以我的方法是把一个楼层拆成n个点(这样做的前提是在这道题中n比较小<=5)分别表示从哪一个电梯下来的。然后再把相同楼层的点之间加一条长度为60的边。这样再通过执行n次Dijkstra算法去最小值得出答案。
代码如下:
#include <iostream> #include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> #include <utility> #include <vector> #include <queue> #include <stack> #define INF 500001 #define LEN 610 using namespace std; typedef pair<int, int> pii; vector<pii> Map[LEN]; int dis[LEN]; void Dijkstra(int vex){ priority_queue<pii, vector<pii>, greater<pii> > q; int vis[LEN] = {0}; for(int i=0; i<LEN; i++) dis[i] = (i==vex?0:INF); q.push(make_pair(dis[vex], vex)); while(!q.empty()){ pii nv = q.top(); q.pop(); int x = nv.second; if(vis[x]) continue; vis[x] = 1; for(vector<pii>::iterator it = Map[x].begin(); it!=Map[x].end(); ++it){ int y = it->first, v = it->second; if(dis[y]>dis[x]+v){ dis[y] = dis[x]+v; q.push(make_pair(dis[y], y)); } } } } int main() { // freopen("in.txt", "r", stdin); int n, K, sp[LEN], avi[LEN]; while(scanf("%d%d", &n, &K)!=EOF){ for(int i=0; i<LEN; i++)Map[i].clear(); for(int i=0; i<n; i++){ scanf("%d", &sp[i]); } for(int i=0; i<n; i++){ int top = 0; while(scanf("%d", &avi[top++])!=EOF) if(getchar()=='\n')break; int idx = i*100; for(int j=0; j<top; j++){ for(int k=j+1; k<top; k++){ Map[idx+avi[j]].push_back(make_pair(idx+avi[k], (avi[k]-avi[j])*sp[i])); Map[idx+avi[k]].push_back(make_pair(idx+avi[j], (avi[k]-avi[j])*sp[i])); } } } for(int i=0; i<100; i++){ for(int j=0; j<n; j++){ for(int k=0; k<n; k++){ Map[j*100+i].push_back(make_pair(k*100+i, 60)); Map[k*100+i].push_back(make_pair(j*100+i, 60)); } } } int ans = INF; for(int i=0; i<n; i++){ Dijkstra(0+i*100); for(int j=0; j<n; j++) ans = min(ans, dis[K+j*100]); } if(ans==INF) printf("IMPOSSIBLE\n"); else printf("%d\n", ans); } return 0; }
View Code
相关文章推荐
- uva 10801 - Lift Hopping(最短路Dijkstra)
- UVa 10801 - Lift Hopping(Dijkstra, SPFA最短路)
- UVA 10801 - Lift Hopping(dijkstra)
- [UVA 10801]Lift Hopping[Dijkstra][建图]
- uva 10801 Lift Hopping Dijkstra最短路
- UVA 10801 - Lift Hopping Dijkstra 算法
- uva 10801 Lift Hopping(dijkstra)
- uva 10801(乘电梯dijkstra)
- UVa 10801 Lift Hopping (最短路+Dijkstra+建图)
- uva 10801 - Lift Hopping(最短路Dijkstra)
- UVA - 10801 Lift Hopping (Dijkstra)
- UVa 10801 - Lift Hopping (Floyd, Dijkstra, SPFA三合一)
- UVa 10801 Lift Hopping (Dijkstra)
- uva10801 Dijkstra
- uva 11280(Dijkstra+递推)
- uva 11367 (Dijkstra+DP)
- UVA 10801 Lift Hopping(最短路)
- UVA 12661 Funny Car Racing (Dijkstra最短路)
- UVA 10806 Dijkstra, Dijkstra.(费用流)
- UVA 10806 Dijkstra, Dijkstra.