深海資源考察探險隊的潛艇將到達深海的海底進行科學考察。
潛艇內有多個深海機械人。潛艇到達深海海底後,深海機械人將離開潛艇向預定目標移動。
深海機械人在移動中還必須沿途採集海底生物標本。沿途生物標本由最先遇到它的深海機械人完成採集。
每條預定路徑上的生物標本的價值是已知的,而且生物標本只能被採集一次。
本題限定深海機械人只能從其出發位置沿著向北或向東的方向移動,而且多個深海機械人可以在同一時間佔據同一位置。
用乙個 p\times qp×q 網格表示深海機械人的可移動位置。西南角的座標為 (0,0)(0,0),東北角的座標為 (q,p)(q,p) 。
給定每個深海機械人的出發位置和目標位置,以及每條網格邊上生物標本的價值。
計算深海機械人的最優移動方案, 使深海機械人到達目的地後,採集到的生物標本的總價值最高。
輸入格式:
檔案的第 11 行為深海機械人的出發位置數 aa,和目的地數 bb 。
第 22 行為 pp 和 qq 的值。
接下來的 p+1p+1 行,每行有 qq 個正整數,表示向東移動路徑上生物標本的價值,行資料依從南到北方向排列。
再接下來的 q+1q+1 行,每行有 pp 個正整數,表示向北移動路徑上生物標本的價值,行資料依從西到東方向排列。
接下來的 aa 行,每行有 33 個正整數 k,x,yk,x,y,表示有 kk 個深海機械人從 (x,y)(x,y) 位置座標出發。
再接下來的 bb 行,每行有 33 個正整數 r,x,yr,x,y ,表示有 rr 個深海機械人可選擇 (x,y)(x,y) 位置座標作為目的地。
a行和b行輸入時橫縱座標要反過來
輸出格式:
輸出採集到的生物標本的最高總價值.
輸入樣例#1: 複製
1 1輸出樣例#1: 複製2 21 2
3 45 6
7 28 10
9 32 0 0
2 2 2
421\leq p,q\leq151≤p,q≤15
1\leq a\leq 41≤a≤4
1\leq b\leq 61≤b≤6
這個題目,很容易讓人想到是最小費用最大流,但是看到這麼小的資料範圍就會好一點吧。
講一下這個題目的思路:
這個題目建圖就是按照這個座標軸建圖,每乙個點連線它可以走的下乙個點,座標源點和s點相連,(p,q),和匯點t相連。
不過這個輸入有點噁心,
我是用的map和pair來記錄輸入的,還有很多別的方法。
因為這個輸入的是邊權,所以每乙個邊你只走一次就容量設定成1費用設定成你輸入的那個數就可以了,
還有就是說每乙個點可以走很多次,這個就是說這個邊可以經過很多次,這個就再存一次這個邊容量為inf,費用為0就可以了。
這個題目和火星探險很像,可以寫寫那個。
#include #include#include
#include
#include
#include
#include
#include
#include
#include
#define inf 0x3f3f3f3f
using
namespace
std;
typedef
long
long
ll;const
int inf = 0x3f3f3f3f
;const
int maxn =1e5;
struct
edge
};vector
e;vector
g[maxn];
int a[maxn];//
找增廣路每個點的水流量
int p[maxn];//
每次找增廣路反向記錄路徑
int d[maxn];//
spfa演算法的最短路
int inq[maxn];//
spfa演算法是否在佇列中
ints, t;
void
init()
void add(int u, int v, int c, int
cost)
bool bellman(int s, int t, int& flow, long
long &cost)
//bellman 演算法入隊
} }
}if (d[t] == inf)return
false;//
找不到增廣路
flow += a[t];//
最大流的值,此函式引用flow這個值,最後可以直接求出flow
cost += (long
long)d[t] * (long
long)a[t];//
距離乘上到達匯點的流量就是費用
for (int u = t; u != s; u = e[p[u]].u)//
逆向存邊
return
true;}
int maxcostmaxflow(int s, int t, long
long &cost)
mapint, int>, int >mp;
intmain()
}s = 0, t = 1
;
for (int i = 0; i <= p; i++)
}for (int i = 0; i <= q; i++)
}for (int i = 1; i <= n; i++)
for (int i = 1; i <= m; i++)
ll cost = 0
;
int ans =maxcostmaxflow(s, t, cost);
printf(
"%lld\n
", -cost);
}return0;
}
網路流24題 深海機械人問題
網路流24題大多需要spj,所以需要乙個有spj的oj,本系列 均在www.oj.swust.edu.cn測試通過 這道題其實和數字梯形的第三個規律挺像的 點和路徑均可重合 唯一的差別就是這道題的路徑權值只能計算一次,那怎麼辦呢,其實不難,我們只要將容量為inf的邊的權值修改為0,在此基礎上再加一條...
深海機械人問題 網路流24題
思路 和方格取數差不多的一道題 只是輸入有點噁心 然而他好像提示了怎麼輸出 之後就是建圖標準最大費用最大流了 不知道為什麼spfa的最大流t了乙個點 難道說資料這麼喪心病狂嗎 zkw的話倒是50ms就跑完了 code 1 include 2 define dbg x cout x x endl34 ...
網路流24題 深海機械人(最大費用流)
深海機械人 題意 給定帶一次性邊權網格與若干機械人的起終點,規定起終點必須被機械人經過的次數,求所有機械人能夠得到的最大邊權和.最大費用流,源點向起點連邊,終點向匯點連邊,方格上的點向相鄰點連流量為1費用為val的邊.除此之外,對於題目要求,多個機械人可以在同一時間佔據同一位置 方格上的點還要向相鄰...