1111. Online Map (30)解题报告
2016-12-31 11:58
441 查看
求时间最短路径时,如果时间相同,则选择通过交叉路口最少的路线。仔细审题,否则会容易出错。
#define _CRT_SECURE_NO_WARNINGS #include <cstdio> #include <cstdlib> #include <queue> #include <vector> #include <stack> using namespace std; struct node { int len, time; int v1, v2; }; void Dijkstra1(vector<node> arr[], int n, vector<int> path[]); void Dijkstra2(vector<node> arr[], int n, vector<int> path[]); void DFS1(vector<node> arr[], vector<int> path[], int index); void DFS2(vector<node> arr[], vector<int> path[], int index); const int MAX = 100000000; stack<int> road; int time = MAX, len = MAX, source, destination; int main(void) { int i, n, m, v1, v2, one_way, t, l, t2, d1; node tmp; vector<node> *arr; vector<int> *path; stack<int> path1, path2; scanf("%d %d", &n, &m); arr = new vector<node> ; path = new vector<int> ; for (i = 0; i < m; i++) { scanf("%d %d %d %d %d", &v1, &v2, &one_way, &l, &t); tmp.len = l; tmp.time = t; tmp.v2 = v2; tmp.v1 = v1; arr[v1].push_back(tmp); if(!one_way) { tmp.v2 = v1; tmp.v1 = v2; arr[v2].push_back(tmp); } } scanf("%d %d", &source, &destination); Dijkstra1(arr, n, path); DFS1(arr, path, destination); d1 = len; path1 = road; for (i = 0; i < n; i++) { path[i].clear(); } time = MAX; while (!road.empty()) { road.pop(); } Dijkstra2(arr, n, path); DFS2(arr, path, destination); t2 = time; path2 = road; if (path1 == path2) { printf("Distance = %d; Time = %d: %d", d1, t2, path2.top()); path2.pop(); while (!path2.empty()) { printf(" -> %d", path2.top()); path2.pop(); } putchar('\n'); } else { printf("Distance = %d: %d", d1, path1.top()); path1.pop(); while (!path1.empty()) { printf(" -> %d", path1.top()); path1.pop(); } putchar('\n'); printf("Time = %d: %d", t2, path2.top()); path2.pop(); while (!path2.empty()) { printf(" -> %d", path2.top()); path2.pop(); } putchar('\n'); } return 0; } void Dijkstra1(vector<node> arr[], int n, vector<int> path[]) { int i, j, *dist = new int ; bool *visit = (bool *)calloc(n, sizeof(bool)); for (i = 0; i < n; i++) { dist[i] = MAX; } dist[source] = 0; int min, index; for (i = 0; i < n; i++) { min = MAX; index = -1; for (j = 0; j < n; j++) { if (!visit[j] && dist[j] < min) { min = dist[j]; index = j; } } if (index == -1) { return; } visit[index] = true; for (j = 0; j < arr[index].size(); j++) { if (dist[index] + arr[index][j].len < dist[arr[index][j].v2]) { dist[arr[index][j].v2] = dist[index] + arr[index][j].len; path[arr[index][j].v2].clear(); path[arr[index][j].v2].push_back(index); } else if (dist[index] + arr[index][j].len == dist[arr[index][j].v2]) { path[arr[index][j].v2].push_back(index); } } } len = dist[destination]; return; } void Dijkstra2(vector<node> arr[], int n, vector<int> path[]) { int i, j, *t = new int ; bool *visit = (bool *)calloc(n, sizeof(bool)); for (i = 0; i < n; i++) { t[i] = MAX; } t[source] = 0; int min, index; for (i = 0; i < n; i++) { min = MAX; index = -1; for (j = 0; j < n; j++) { if (!visit[j] && t[j] < min) { min = t[j]; index = j; } } if (index == -1) { return; } visit[index] = true; for (j = 0; j < arr[index].size(); j++) { if (t[index] + arr[index][j].time < t[arr[index][j].v2]) { t[arr[index][j].v2] = t[index] + arr[index][j].time; path[arr[index][j].v2].clear(); path[arr[index][j].v2].push_back(index); } else if (t[index] + arr[index][j].time == t[arr[index][j].v2]) { path[arr[index][j].v2].push_back(index); } } } time = t[destination]; return; } void DFS1(vector<node> arr[], vector<int> path[], int index) { static stack<int> s; static int t = 0; if (index == source) { s.push(index); if (t < time) { time = t; road = s; } s.pop(); } else { int i, j; s.push(index); for (i = 0; i < path[index].size(); i++) { for (j = 0; j < arr[path[index][i]].size(); j++) { if (arr[path[index][i]][j].v2 == index) { t += arr[path[index][i]][j].time; break; } } DFS1(arr, path, path[index][i]); t -= arr[path[index][i]][j].time; } s.pop(); } } void DFS2(vector<node> arr[], vector<int> path[], int index) { static stack<int> s; if (index == source) { s.push(index); if (road.size() == 0) { road = s; } else if (s.size() < road.size()) { road = s; } s.pop(); } else { int i, j; s.push(index); for (i = 0; i < path[index].size(); i++) { DFS2(arr, path, path[index][i]); } s.pop(); } }
相关文章推荐
- PAT 解题报告 1049. Counting Ones (30)
- 1076. Forwards on Weibo (30)解题报告
- Integer Factorization (30)解题报告
- 1111. Online Map (30)
- 1111. Online Map (30)-PAT甲级真题(Dijkstra + DFS)
- Codeforces Round #393 (Div. 2) D题Travel Card(map,dp)解题报告
- 1045. Favorite Color Stripe (30)解题报告
- 1111. Online Map (30)
- 1080. Graduate Admission (30)解题报告
- 1064. Complete Binary Search Tree (30)解题报告
- 1053. Path of Equal Weight (30)解题报告
- 1111. Online Map (30)
- PAT 解题报告 1004. Counting Leaves (30)
- [Leetcode] 30. Substring with Concatenation of All Words 解题报告
- [leetcode] 30. Substring with Concatenation of All Words 解题报告
- 1115. Counting Nodes in a BST (30)解题报告
- 1068. Find More Coins (30)解题报告
- 1111. Online Map (30)
- 1049. Counting Ones (30)解题报告
- PAT (Advanced Level) 1103. Integer Factorization (30) 解题报告