博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
POJ 3635 Full Tank?
阅读量:4583 次
发布时间:2019-06-09

本文共 2428 字,大约阅读时间需要 8 分钟。

POJ_3635

    可以把图上一个点拆成C+1个点然后直接应用dij即可,同时总状态是一定的,为了减少每一步的决策量,我们可以每次加油都只加1个单位。

    貌似这样的题目用dij都会比SPFA快一些,因为状态比较多,而dij搜到终点就可以退出,这样相比SPFA减少了对很多无用状态的搜索量。

#include
#include
#define MAXD 1010 #define MAXM 20010 #define MAXC 110 #define MAXT 110000 #define INF 0x3f3f3f3f int N, M, Q, D, S, E, C, e, cost[MAXD], first[MAXD], next[MAXM], v[MAXM], w[MAXM]; int f[MAXT], tree[4 * MAXT]; void update(int i) {
for(; i ^ 1; i >>= 1) tree[i >> 1] = f[tree[i]] < f[tree[i ^ 1]] ? tree[i] : tree[i ^ 1]; } void new_edge(int x, int y, int z) {
v[e] = y, w[e] = z; next[e] = first[x], first[x] = e; ++ e; } void init() {
int i, j, k, x, y, z; for(i = 0; i < N; i ++) scanf("%d", &cost[i]); memset(first, -1, sizeof(first[0]) * N); e = 0; for(i = 0; i < M; i ++) {
scanf("%d%d%d", &x, &y, &z); new_edge(x, y, z), new_edge(y, x, z); } } int get_id(int x, int c) {
return x * (C + 1) + c + 1; } void divide_id(int id, int &x, int &c) {
c = (id - 1) % (C + 1); x = (id - 1) / (C + 1); } void solve() {
int i, j, k, x, c, id; scanf("%d", &Q); for(k = 0; k < Q; k ++) {
scanf("%d%d%d", &C, &S, &E); for(D = 1; D < N * (C + 1); D <<= 1); memset(f + 1, 0x3f, sizeof(f[0]) * (N * (C + 1))); f[0] = INF; memset(tree + 1, 0, sizeof(tree[0]) * (D << 1)); j = get_id(S, 0); f[j] = 0, tree[j + D] = j, update(j + D); while(id = tree[1]) {
divide_id(id, x, c); if(x == E) break; tree[D + id] = 0, update(D + id); if(c < C) {
j = get_id(x, c + 1); if(f[id] + cost[x] < f[j]) {
f[j] = f[id] + cost[x]; tree[j + D] = j, update(j + D); } } for(i = first[x]; i != -1; i = next[i]) if(c >= w[i]) {
j = get_id(v[i], c - w[i]); if(f[id] < f[j]) {
f[j] = f[id]; tree[j + D] = j, update(j + D); } } } if(tree[1] == 0) printf("impossible\n"); else printf("%d\n", f[tree[1]]); } } int main() {
while(scanf("%d%d", &N, &M) == 2) {
init(); solve(); } return 0; }

转载于:https://www.cnblogs.com/staginner/archive/2012/03/28/2421191.html

你可能感兴趣的文章
asp代码获取年数,季度数.星期数,天数,小时数,分钟数,秒数等时
查看>>
python之建完model之后操作admin
查看>>
Java 类加载机制 ClassLoader Class.forName 内存管理 垃圾回收GC
查看>>
shell 脚本后台运行知识
查看>>
php设置cookie,在js中如何获取
查看>>
实验三+099+吴丹丹
查看>>
[bzoj3036]绿豆蛙的归宿
查看>>
[洛谷P5057][CQOI2006]简单题
查看>>
多线程同步的几种方法
查看>>
数据结构-冒泡排序
查看>>
关于程序状态字寄存器PSW(Program Status Word)与多核多线程
查看>>
mybatis的缓存
查看>>
java 缓冲流 Buffer
查看>>
7月23号=》261页-265页
查看>>
软考知识点梳理--综合布线
查看>>
Mysql5.6主从热备配置
查看>>
VS2010DebugView捕捉
查看>>
mfix中更改time dependent VTK filename的最大时间步数的容量
查看>>
Windows7安装 docker-compose的过程
查看>>
关于nodeJS多线程的支持,目前看来无法实现,讲解v8的一些东西
查看>>