題解 APIO2013機械人

2022-02-27 13:04:39 字數 2351 閱讀 4755

其實這題前前後後的思考時間加起來應該有兩天之久了,dp狀態,轉移方式等等都還是比較好想,然而左看右看覺得spfa複雜度未免太**……然後選擇看了一篇題解,發現在多重優化之下,其實是可以過的……

首先建立狀態,這個應該比較明顯:\(f[l][r][x][y]\) 代表合併完區間 \(l\) ~\(r\) 之後,機械人停在 \(x,y\) 處所需要的最少移動次數。轉移狀態即為:

\(f[l][r][x][y] = f[l][k][x][y] + f[k + 1][r][x][y] \left ( l <= k <= r \right )\)

\(f[l][r][x][y] = f[l][r][x'][y'] + 1 \)

其中第二個轉移發生的條件是 \(x',y'\) 可以一步到達 \(x,y\)。第二個轉移狀態就是在之前的部落格中所提及的那樣:1.滿足三角形不等式;2.不滿足拓撲序;針對這樣的轉移,我們用 spfa 來優化 dp 的轉移。注意在這張圖中,邊權均為1。在單源的最短路中,這樣的圖spfa可以優化為bfs, 在多源最短路中我們可以使用兩個佇列來進行優化。這兩個佇列分別儲存新增的節點 & 被鬆弛所以要去鬆弛其餘節點的節點。這樣將節點分類之後,每一次取出隊首元素權值更小的進行鬆弛操作。我們會發現第二個佇列中節點的權值是單調的(在邊權為1的圖中,先訪問到的節點權值更小),而第乙個佇列中的元素我們使用基數排序來排。(並不知道為什麼要用基數排序,或許就是比較快吧?)

然後這份**是我抄的大佬的**,非常感謝了。其中有乙個小小的技巧:memset的時候預設賦給節點當前資料型別的最大值,相加會溢位。但對於這種沒有正負要求的,我們可以利用 unsigned 自然溢位使得結果依然是最大值。(・ω<)☆ 感覺這題還是挺毒的,差點就被毒死了……

#include using

namespace

std;

#define maxn 505

#define maxk 400000

#define uns unsigned short

#define inf 32639

int n, w, h, ans =inf;

int mark[maxn][maxn][5

];int

l, r;

uns f[

12][12

][maxn][maxn];

intcnt, top, tank[maxk], s[maxk];

char

map[maxn][maxn];

bool

vis[maxn][maxn];

int dxy[4][2] = , , , };

struct

node

}g[maxn][maxn][

5], pos[11

], q[maxk];

queue

q1, q2;

intread()

while(c >= '

0' && c <= '

9') x = x * 10 + c - '

0', c =getchar();

return x *k;

}void gmin(uns &x, uns y)

node dfs(

int x, int y, int

k)void

spfa()

vis[now.x][now.y] = 0

;

for(int i = 0; i < 4; i ++)}}

}int

main()

for(int i = 1; i <= h; i ++)

for(int j = 1; j <= w; j ++)

if(map[i][j] != 'x'

)

for(int k = 0; k < 4; k ++)

++cnt, dfs(i, j, k);

for(int i = 1; i <= n; i ++)

for(int l = 2, j; l <= n; l ++)

for(int i = 1; (j = i + l - 1) <= n; i ++)

l = i, r =j; spfa();

}unsigned

short ans =inf;

for(int i = 1; i <= h; i ++)

for(int j = 1; j <= w; j ++)

ans = min(ans, f[1

][n][i][j]);

if(ans < inf) printf("

%u\n

", ans);

else printf("

-1\n");

return0;

}

APIO2013 道路費用

給定一張無向連通圖,存在邊權 c c 與點權a role presentation aa。加入kk 條特殊邊,構造出這些邊的邊權使得存在一棵最小生成樹使得所有點到 1 role presentation 1 1號點的距離 只考慮特殊邊的長度 乘以該點點權的乘積最大。n 1000000,m 30000...

APIO2013 道路費用

題目鏈結 大意是說,調整k條特殊邊邊的值,並在原圖的基礎上構建最小生成樹。使得經過所有特殊邊的值之和最大。感謝das 學長指出題目要素 加上新邊,兩點之間最多只有一條邊 請各位在理解下文解法時特別注意,如果沒有這一要求是不能設計如下演算法的。在此安利一下hgeek首席程式設計師的部落格。大致解法 先...

cogs 機械人搬運 題解

wind設計了很多機械人。但是它們都認為自己是最強的,於是,一場比賽開始了 機器人們都想知道誰是最勇敢的,於是它們比賽搬運一些物品。它們到了乙個倉庫,裡面有n個物品,每個物品都有乙個價值pi和重量wi,但是有些物品放在一起會 並且 具有傳遞性 a和b會 b和c會 則a和c會 機器人們可不想因此損失自...