深海機械人 網路流

2022-05-03 14:03:20 字數 3036 閱讀 1689

深海資源考察探險隊的潛艇將到達深海的海底進行科學考察。

潛艇內有多個深海機械人。潛艇到達深海海底後,深海機械人將離開潛艇向預定目標移動。

深海機械人在移動中還必須沿途採集海底生物標本。沿途生物標本由最先遇到它的深海機械人完成採集。

每條預定路徑上的生物標本的價值是已知的,而且生物標本只能被採集一次。

本題限定深海機械人只能從其出發位置沿著向北或向東的方向移動,而且多個深海機械人可以在同一時間佔據同一位置。

用乙個 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

2 21 2

3 45 6

7 28 10

9 32 0 0

2 2 2

輸出樣例#1: 複製

42
1\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的邊.除此之外,對於題目要求,多個機械人可以在同一時間佔據同一位置 方格上的點還要向相鄰...