[复习记录] 浙大 PAT 甲级 1111 Online Map 带有等长路径选择策略的、用邻接矩阵实现的disktra算法 DFS
2019-09-05 10:06
369 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_39115541/article/details/100552417
[code]#include<stdio.h> #include<vector> #define INF 10000000; using namespace std; int length[500][500]; int time[500][500]; int dis[500], dispre[500], timepre[500], weight[500]; vector<int> lengthRoute, timeRoute; void getLengthRoute(int i, int start) { lengthRoute.push_back(i); if (i == start) { return; } getLengthRoute(dispre[i], start); } void getTimeRoute(int i, int start) { timeRoute.push_back(i); if (i == start) { return; } getTimeRoute(timepre[i], start); } int main() { int N, M; scanf("%d%d", &N, &M); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { length[i][j] = -1; time[i][j] = -1; } } for (int i = 0; i < M; i++) { int v1, v2, oneway, l, t; scanf("%d%d%d%d%d", &v1, &v2, &oneway, &l, &t); length[v1][v2] = l; time[v1][v2] = t; if (oneway == 0) { length[v2][v1] = l; time[v2][v1] = t; } } int start, end; scanf("%d%d", &start, &end); bool visit[500]; for (int i = 0; i < N; i++) { dis[i] = -1; dispre[i] = i; visit[i] = false; weight[i] = INF; } dis[start] = 0; weight[start] = 0; for (int i = 0; i < N; i++) { int update = -1, min = INF; for (int j = 0; j < N; j++) { if (visit[j] == false && dis[j] != -1 && dis[j] < min) { update = j; min = dis[j]; } } if (update == -1) { break; } visit[update] = true; for (int j = 0; j < N; j++) { if (visit[j] == false && length[update][j] != -1) { if (dis[j] == -1 || length[update][j] + dis[update] < dis[j]) { dis[j] = length[update][j] + dis[update]; dispre[j] = update; weight[j] = weight[update] + time[update][j]; } else if (dis[j] != -1 && length[update][j] + dis[update] == dis[j] && weight[j] > weight[update] + time[update][j]) { weight[j] = weight[update] + time[update][j]; dispre[j] = update; } } } } getLengthRoute(end, start); int ansLength = dis[end]; for (int i = 0; i < N; i++) { dis[i] = -1; visit[i] = false; weight[i] = INF; timepre[i] = i; } dis[start] = 0; weight[start] = 0; for (int i = 0; i < N; i++) { int update = -1, min = INF; for (int j = 0; j < N; j++) { if (visit[j] == false && dis[j] != -1 && dis[j] < min) { min = dis[j]; update = j; } } if (update == -1) { break; } visit[update] = true; for (int j = 0; j < N; j++) { if (visit[j] == false && time[update][j] != -1) { if (dis[j] == -1 || dis[j] > dis[update] + time[update][j]) { timepre[j] = update; dis[j] = dis[update] + time[update][j]; weight[j] = weight[update] + 1; } else if (dis[j] != -1 && time[update][j] + dis[update] == dis[j] && weight[j] > weight[update] + 1) { timepre[j] = update; weight[j] = weight[update] + 1; } } } } getTimeRoute(end, start); int ansTime = dis[end]; bool isDistinct = false; if (timeRoute.size() != lengthRoute.size()) { isDistinct = true; } else { for (int i = 0; i < timeRoute.size(); i++) { if (timeRoute[i] != lengthRoute[i]) { isDistinct = true; break; } } } if (!isDistinct) { printf("Distance = %d; Time = %d: %d", ansLength, ansTime, start); for (int i = lengthRoute.size() - 2; i >= 0; i--) { printf(" -> %d", lengthRoute[i]); } printf("\n"); } else { printf("Distance = %d: %d", ansLength, start); for (int i = lengthRoute.size() - 2; i >= 0; i--) { printf(" -> %d", lengthRoute[i]); } printf("\n"); printf("Time = %d: %d", ansTime, start); for (int i = timeRoute.size() - 2; i >= 0; i--) { printf(" -> %d", timeRoute[i]); } printf("\n"); } return 0; }
相关文章推荐
- PAT 甲级 1111 Online Map (考察迪杰斯特拉算法和深度优先搜索dfs)
- PAT 1111 —— Online Map(Dijkstra单源最短路径)
- PAT甲级1111 Online Map (30)
- PAT (Advanced Level)-1111 Online Map(dijkstra+dfs)
- 1111 Online Map (30 分)--PAT甲级
- PAT甲级——1111 Online Map (单源最短路经的Dijkstra算法、priority_queue的使用)
- PAT甲级1111 Online Map
- Python实现一个命令行下的简单辅助记单词程序,能够实现:添加新的单词及其中文含义、浏览已经记录的单词、随机选择部分单词进行浏览复习。
- 浙大 PAT 甲级 1126 Eulerian Path 并查集 欧拉路径 欧拉环路
- PAT (Advanced Level) Practise 1111 Online Map (30)
- PAT程序设计练习——甲级1003(任意两个城市最短距离、Floyd最短路径算法)
- PAT 甲级 1021. Deepest Root(dfs:无向图的最远路径、连通分量个数)
- **浙大PAT甲级 1103 dfs+快速幂
- *浙大PAT甲级 1087 dijkstra+dfs
- 【算法】Dijkstra算法(单源最短路径问题) 邻接矩阵和邻接表实现
- 最短路径算法之Dijkstra算法(邻接矩阵实现)
- 浙大pat | 浙大pat 牛客网甲级 1001Public Bike Management (30) 迪杰斯特拉改进算法
- 图的邻接矩阵表示与最短路径算法( Dijkstra )代码实现
- 图的邻接矩阵和邻接表存储的深度优先遍历(DFS)算法实现
- 1111. Online Map (30)-PAT甲级真题(Dijkstra + DFS)