PAT 甲级 1018 Public Bike Management
2018-02-28 23:29
295 查看
DFS+记忆化搜索剪枝
没试过不剪枝会不会超时。
注意点就是没有返回修改这个说法
10 4 4 5
3 5 5 10
0 1 1
0 2 1
1 3 1
2 3 1
3 4 1
这组数据出来的结果是 0 0->2->3->4 5
别的应该没什么问题…判断语句写的好搓
更新 不剪枝直接爆搜也不会超时…
没试过不剪枝会不会超时。
注意点就是没有返回修改这个说法
10 4 4 5
3 5 5 10
0 1 1
0 2 1
1 3 1
2 3 1
3 4 1
这组数据出来的结果是 0 0->2->3->4 5
别的应该没什么问题…判断语句写的好搓
更新 不剪枝直接爆搜也不会超时…
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> #include <vector> #include <queue> #include <stack> using namespace std; struct node { int len; int id; }; int C, n, sp, m; int c[505]; int d[505]; int pren[505]; vector<node> v[505]; vector<int> route; int resto, resback, ans; bool flag[505]; void getroute() { pren[0] = -1; route.clear(); int temp = sp; while (pren[temp] != -1) { route.push_back(temp); temp = pren[temp]; } route.push_back(0); } void dfs(int st, int ed, int l, int to,int back, int pre) { if (st == ed) { if (ans > l || ans == -1) { pren[ed] = pre; getroute(); ans = l; resto = to; resback = back; } else if (ans == l) { if (to < resto) { resto = to; resback = back; pren[ed] = pre; getroute(); } else if (to == resto) { if (back < resback) { resback = back; pren[ed] = pre; getroute(); } } } } else { for (int i = 0; i < v[st].size(); i++) { if (flag[v[st][i].id] == 1) continue; int temp = l + v[st][i].len; if (d[v[st][i].id] == -1 || d[v[st][i].id] >= temp) { int nextp = v[st][i].id; d[nextp] = temp; pren[nextp] = st; flag[nextp] = 1; int tempb = back + c[nextp] - C / 2; int tempto = to; if (tempb <= 0) { tempto = to - tempb; tempb = 0; } dfs(nextp, ed, temp, tempto, tempb, st); flag[nextp] = 0; } } } } int main() { while (~scanf("%d%d%d%d", &C, &n, &sp, &m)) { memset(d, -1, sizeof(d)); for (int i = 0; i <= n; i++) { v[i].clear(); } int a, b, l; for (int i = 1; i <= n; i++) { scanf("%d", &c[i]); } for (int i = 1; i <= m; i++) { scanf("%d%d%d", &a, &b, &l); node t1; t1.id = b; t1.len = l; v[a].push_back(t1); node t2; t2.id = a; t2.len = l; v[b].push_back(t2); } ans = -1; memset(flag, 0, sizeof(flag)); flag[0] = 1; resto = -1; resback = -1; route.clear(); route.push_back(0); dfs(0, sp, 0, 0, 0, 0); if (resto < 0) printf("0 "); else printf("%d ", resto); for (int i = route.size() - 1; i >= 0; i--) { printf("%d", route[i]); if (i == 0) printf(" "); else printf("->"); } if (resback < 0) printf("0"); else printf("%d", resback); printf("\n"); } return 0; }
相关文章推荐
- PAT(甲级)1018. Public Bike Management (30)
- 1018. Public Bike Management (30) PAT 甲级
- 1018. Public Bike Management (30)-PAT甲级真题(Dijkstra + DFS)
- PAT (Advanced Level) Practise 1018 Public Bike Management (30)
- PAT (Advanced Level)1018. Public Bike Management (30) 迪杰斯特拉算法 DFS 递归(难)
- PAT 1018 Public Bike Management(Dijkstra 最短路)
- PAT-Java-1018-Public Bike Management (30)
- PAT 1018 Public Bike Management
- PAT 1018 Public Bike Management(Dijkstra 最短路)
- PAT 1018 Public Bike Management DFS+SPFA
- pat 甲级 Public Bike Management
- PAT-1018 Public Bike Management(dijkstra + dfs)
- 【PAT1018】Public Bike Management
- PAT (Advanced Level) Practise 1018 Public Bike Management (30)
- PAT-1018 Public Bike Management (30)
- PAT甲级1001-Public Bike Management (30)
- PAT-1018 Public Bike Management (30)
- PAT1018 Public Bike Management
- 1018. Public Bike Management (30)——PAT (Advanced Level) Practise
- 1018.Public Bike Management (30)