BZOJ 1003 [ZJOI2006]物流运输trans
2017-01-05 09:10
302 查看
Description
物流公司要把一批货物从码头A运到码头B。由于货物量比较大,需要n天才能运完。货物运输过程中一般要转停好几个码头。物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟踪。由于各种因素的存在,有的时候某个码头会无法装卸货物。这时候就必须修改运输路线,让货物能够按时到达目的地。但是修改路线是一件十分麻烦的事情,会带来额外的成本。因此物流公司希望能够订一个n天的运输计划,使得总成本尽可能地小。Input
第一行是四个整数n(1Output
包括了一个整数表示最小的总成本。总成本=n天运输路线长度之和+K*改变运输路线的次数。Sample Input
5 5 10 8 1 2 1 1 3 3 1 4 2 2 3 2 2 4 4 3 4 1 3 5 2 4 5 2 4 2 2 3 3 1 1 3 3 3 4 4 5Sample Output
32HINT
前三天走1-4-5,后两天走1-3-5,这样总成本为(2+2)*3+(3+2)*2+10=32Solution
一道好题!这道题可~~记忆化搜索~~DP做。Fi表示从第1天到第i天最小花费,转移:Fi=min{Fj+Costj+1,i+K}
Costl,r表示l天到r天不更改航线最小花费。
因为数据范围比较小,暴力转移就可以了。
Code
#include <cstdio> #include <deque> using namespace std; const int maxd = 105; const int maxn = 25; const int INF = 1000000007; int d, n, k, m, q; int cost[maxd][maxd]; int f[maxd]; bool ban[maxn * maxn][maxd]; bool ava[maxd]; int min(int a, int b) { return a < b ? a : b; } int getint() { int r = 0, k = 1; char c; for (c = getchar(); c < '0' || c > '9'; c = getchar() ) if (c == '-') k = -1; for (; '0' <= c && c <= '9'; c = getchar() ) r = r * 10 - '0' + c; return r * k; } struct edge_type { int v, next, w; } edge[maxn * maxn]; int cnte = 0, h[maxn]; void ins(int u, int v, int w) { edge[++cnte].v = v; edge[cnte].w = w; edge[cnte].next = h[u]; h[u] = cnte; } deque<int> Q; int dis[maxn]; bool inque[maxn]; void SPFA() { Q.push_back(1); dis[1] = 0; inque[1] = true; for (int i = 2; i <= n; ++i) dis[i] = INF; int now; while (!Q.empty()) { now = Q.front(); Q.pop_front(); inque[now] = false; for (int i = h[now]; i; i = edge[i].next) { int v = edge[i].v; if (!ava[v]) continue; if (dis[v] > dis[now] + edge[i].w) { dis[v] = dis[now] + edge[i].w; if (!inque[v]) { Q.push_back(v); inque[v] = true; } } } } } int main() { d = getint(); n = getint(); k = getint(); m = getint(); int u, v, w; for (int i = 0; i < m; ++i) { u = getint(); v = getint(); w = getint(); ins(u, v, w); ins(v, u, w); } q = getint(); for (int i = 0; i < q; ++i) { u = getint(); v = getint(); w = getint(); for (int j = v; j <= w; ++j) ban[u][j] = true; } for (int i = 1; i <= d; ++i) for (int j = i; j <= d; ++j) { for (int mt = 1; mt <= n; ++mt) { ava[mt] = true; for (int t = i; t <= j; ++t) if (ban[mt][t]) { ava[mt] = false; break; } } SPFA(); if (dis == INF) cost[i][j] = INF; else cost[i][j] = dis * (j-i+1); } for (int i = 1; i <= d; ++i) { f[i] = cost[1][i]; for (int j = 1; j <= i; ++j) f[i] = min(f[i], f[j] + cost[j+1][i] + k); } printf("%d\n", f[d]); return 0; }
相关文章推荐
- bzoj 1003 [ZJOI2006] 物流运输trans 题解
- bzoj 1003 [ZJOI2006]物流运输trans 最短路+DP
- BZOJ 1003 [ZJOI2006]物流运输trans ★(Dijkstra + DP)
- BZOJ 1003 ZJOI2006 物流运输trans 动态规划+SPFA
- BZOJ 1003 [ZJOI2006]物流运输trans SPFA+DP
- BZOJ 1003 [ZJOI2006]物流运输trans ★(Dijkstra + DP)
- [ZJOI2006][BZOJ1003] 物流运输trans
- 1003: [ZJOI2006]物流运输trans - BZOJ
- BZOJ1003 [ZJOI2006]物流运输trans(集合型动态规划)
- BZOJ-1003-物流运输trans-ZJOI2006-SPFA+DP
- bzoj1003[ZJOI2006]物流运输trans
- BZOJ1003 [ZJOI2006] 物流运输trans
- BZOJ-1003-物流运输trans-ZJOI2006-SPFA+DP
- 【DP+SPFA】【ZJOI2006】【bzoj1003】【cogs1824】物流运输trans
- BZOJ 1003: [ZJOI2006]物流运输trans
- [BZOJ1003][ZJOI2006]物流运输trans
- bzoj1003 [ZJOI2006]物流运输trans
- [bzoj1003] [ZJOI2006]物流运输trans
- bzoj 1003: [ZJOI2006]物流运输trans
- BZOJ 1003: [ZJOI2006]物流运输trans DP+SPFA