51 nod: 1459 迷宫游戏
2017-12-03 22:51
441 查看
题目
Input
Output
Input示例
Output示例
题解
代码
第二行包含n个空格分隔的正整数(不超过600),表示进入每个房间你的得分。
再接下来m行,每行3个空格分隔的整数x, y, z (0
cntValue[i]=max(cntValue[idx]+val[i],cntValue[i]);
Input
Output
Input示例
Output示例
题解
代码
题目
你来到一个迷宫前。该迷宫由若干个房间组成,每个房间都有一个得分,第一次进入这个房间,你就可以得到这个分数。还有若干双向道路连结这些房间,你沿着这些道路从一个房间走到另外一个房间需要一些时间。游戏规定了你的起点和终点房间,你首要目标是从起点尽快到达终点,在满足首要目标的前提下,使得你的得分总和尽可能大。现在问题来了,给定房间、道路、分数、起点和终点等全部信息,你能计算在尽快离开迷宫的前提下,你的最大得分是多少么?Input
第一行4个整数n (<=500), m, start, end。n表示房间的个数,房间编号从0到(n - 1),m表示道路数,任意两个房间之间最多只有一条道路,start和end表示起点和终点房间的编号。第二行包含n个空格分隔的正整数(不超过600),表示进入每个房间你的得分。
再接下来m行,每行3个空格分隔的整数x, y, z (0
Output
一行,两个空格分隔的整数,第一个表示你最少需要的时间,第二个表示你在最少时间前提下可以获得的最大得分。Input示例
3 2 0 2 1 2 3 0 1 10 1 2 11
Output示例
21 6
题解
本题即是最短路径的dijkstra算法的小小变形,我们在进行查找最小路径时,不仅要更新最短路径长度,当路径长度相同时,我们需要比较两者的价值,选择较大的。其它的与传统的
dijkstra算法相同。
cntValue[i]=max(cntValue[idx]+val[i],cntValue[i]);
代码
#include <iostream> #include <vector> #include <limits> #include <algorithm> #include <cstring> using namespace std; int main() { int n, m, start, end; // n代表点数,m代表路径数 cin >> n >> m >> start >> end; vector<int> val(n); // 记录每个节点的值 for (int i = 0; i < n; ++i) cin >> val[i]; vector<vector<int> > mat(n, vector<int>(n, -1)); int x, y, v; for (int i = 0; i < m; ++i) { cin >> x >> y >> v; mat[x][y] = mat[y][x] = v; } vector<int> d(n,INT_MAX); // 记录路径长度 vector<bool> visit(n, false); // 用于标记是否访问过 vector<int> cntValue(n,0); // 记录可以得到的最大值 d[start] = 0; // 初始化起点的距离,访问标记,累计value visit[start] = true; cntValue[start] = val[start]; int idx = start; for (int i = 0; i < n; ++i) { if (!visit[i] && mat[idx][i] >= 0) // 更新距离 { if (d[idx] + mat[idx][i] == d[i]) // 注意距离相等时选择较大的val { cntValue[i] = max(cntValue[idx] + val[i], cntValue[i]); // 更新累计值 } if (d[idx] + mat[idx][i] < d[i]) { d[i] = d[idx] + mat[idx][i]; cntValue[i] = cntValue[idx] + val[i]; } } } while (true) { int maxLen = INT_MAX; // 查找最小的d for (int i = 0; i < n; ++i) { if (!visit[i] && d[i] < maxLen) { maxLen = d[i]; idx = i; } } if (idx == end) break; // 找到了退出 visit[idx] = true; // 标记变量 for (int i = 0; i < n; ++i) { if (!visit[i] && mat[idx][i] >= 0) // 更新距离 { //d[i] = min(d[i], d[idx] + mat[start][i]); if (d[idx] + mat[idx][i] == d[i]) { cntValue[i] = max(cntValue[idx] + val[i], cntValue[i]); // 更新累计值 } if (d[idx] + mat[idx][i]<d[i]) { d[i] = d[idx] + mat[idx][i]; cntValue[i] = cntValue[idx] + val[i]; } } } } cout << d[end] << " " << cntValue[end] << endl; }
相关文章推荐
- 1459 迷宫游戏(51NOD)
- 51-Nod 1459 迷宫游戏
- 51Nod 1459 迷宫游戏
- 51Nod - 1459 迷宫游戏
- 1459 迷宫游戏
- 带权最短路 51Nod - 1459 - 迷宫游戏
- 51Nod 1459 迷宫游戏 dijkstra拓展
- 51nod 1459 迷宫游戏(最短路)
- 51NOD 1459 迷宫游戏
- 51nod 1459 迷宫游戏 (最短路)
- 51nod 1459 迷宫游戏
- 51Nod 1459 迷宫游戏(dijkstra)
- 迷宫游戏 51Nod - 1459 【最短路变形】
- 51Nod 1459 迷宫游戏(Dijkstra)
- 51 nod 1072 威佐夫游戏
- 51Nod - 1459 迷宫游戏 dijkstra拓展
- 1459 迷宫游戏
- 51nod 1459 迷宫游戏
- 【51Nod】1459 - 迷宫游戏(bfs & 优先队列 & 最短路)
- 51nod 1459 迷宫游戏(bfs)