其實這題前前後後的思考時間加起來應該有兩天之久了,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 usingnamespace
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會 機器人們可不想因此損失自...