PAT1018. Public Bike Management (30)
Posted 肉松松鼠
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT1018. Public Bike Management (30)相关的知识,希望对你有一定的参考价值。
分析
Dijstra + DFS搜索,难点在于存在多条最短路径,因此需要用vector<int> pre[N] 记录路径。
代码
自己写的有些问题,有两个数据没过,就不放上来了。下面的代码来自于https://www.liuchuo.net/archives/2373
#include <cstdio> #include <algorithm> #include <vector> using namespace std; const int inf = 99999999; int cmax, n, sp, m; int minNeed = inf, minBack = inf; int e[510][510], dis[510], weight[510]; bool visit[510]; vector<int> pre[510]; vector<int> path, temppath; void dfs(int v) { if(v == 0) { temppath.push_back(v); int need = 0, back = 0; for(int i = temppath.size() - 1; i >= 0; i--) { int id = temppath[i]; if(weight[id] > 0) { back += weight[id]; } else { if(back > (0 - weight[id])) { back += weight[id]; } else { need += ((0 - weight[id]) - back); back = 0; } } } if(need < minNeed) { minNeed = need; minBack = back; path = temppath; } else if(need == minNeed && back < minBack) { minBack = back; path = temppath; } temppath.pop_back(); return ; } temppath.push_back(v); for(int i = 0; i < pre[v].size(); i++) dfs(pre[v][i]); temppath.pop_back(); } int main() { fill(e[0], e[0] + 510 * 510, inf); fill(dis, dis + 510, inf); scanf("%d%d%d%d", &cmax, &n, &sp, &m); for(int i = 1; i <= n; i++) { scanf("%d", &weight[i]); weight[i] = weight[i] - cmax / 2; } for(int i = 0; i < m; i++) { int a, b; scanf("%d%d", &a, &b); scanf("%d", &e[a][b]); e[b][a] = e[a][b]; } dis[0] = 0; for(int i = 0; i <= n; i++) { int u = -1, minn = inf; for(int j = 0; j <= n; j++) { if(visit[j] == false && dis[j] < minn) { u = j; minn = dis[j]; } } if(u == -1) break; visit[u] = true; for(int v = 0; v <= n; v++) { if(visit[v] == false && e[u][v] != inf) { if(dis[v] > dis[u] + e[u][v]) { dis[v] = dis[u] + e[u][v]; pre[v].clear(); //这里要记得clear pre[v].push_back(u); }else if(dis[v] == dis[u] + e[u][v]) { pre[v].push_back(u); } } } } dfs(sp); printf("%d 0", minNeed); for(int i = path.size() - 2; i >= 0; i--) printf("->%d", path[i]); printf(" %d", minBack); return 0; }
以上是关于PAT1018. Public Bike Management (30)的主要内容,如果未能解决你的问题,请参考以下文章
PAT甲级——A1018 Public Bike Management
PAT1018. Public Bike Management (30)
PAT (Advanced Level) 1018. Public Bike Management (30)
PAT 甲级 1018 Public Bike Management (30 分)(dijstra+dfs case 7 过不了求助!!!)