wiki 1917 深海機械人問題

2021-06-22 22:05:57 字數 1655 閱讀 7893

懶得自己寫題解了。。。

這是我摘錄的別人的題解,跟我的思路一樣

【問題分析】 

最大費用最大流問題。 

【建模方法】 

把網格中每個位置抽象成網路中乙個節點,建立附加源s匯t。 

1、對於每個頂點i,j為i東邊或南邊相鄰的乙個節點,連線節點i與節點j一條容量為1,費用為該邊價值的有向邊。 

2、對於每個頂點i,j為i東邊或南邊相鄰的乙個節點,連線節點i與節點j一條容量為無窮大,費用為0的有向邊。 

3、從s到每個出發點i連線一條容量為該點出發的機械人數量,費用為0的有向邊。 

4、從每個目標點i到t連線一條容量為可以到達該點的機械人數量,費用為0的有向邊。 

求最大費用最大流,最大費用流值就採集到的生物標本的最高總價值。 

【建模分析】 

這個問題可以看做是多出發點和目的地的網路運輸問題。每條邊的價值只能計算一次,容量限制要設為1。同時還將要連線上容量不限,費用為0的重邊。由於「多個深海機械人可以在同一時間佔據同一位置」,所以不需限制點的流量,直接求費用流即可。

下面是我的ac**

#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

const int maxn = 200010;

const int inf = 1 << 30;

int p,q,a,b,s,t,result;

struct edge ;

vectores;

vectorg[maxn];

int a[maxn],d[maxn],p[maxn],inq[maxn];

int dir[2][2] = ;

int mymap1[100][100],mymap2[100][100],pos[100][100];

void addedge(int from, int to, int cap, int cost));

es.push_back(edge);

int u = es.size();

g[from].push_back(u-2);

g[to].push_back(u-1);

}void init()

for(int i = 0; i <= q; i++)

int sz = 0;

for(int i = 0; i <= p; i++)

for(int j = 0; j <= q; j++) pos[i][j] = sz++;

s = sz++;

t = sz++;

for(int i = 0; i < a; i++)

for(int i = 0; i < b; i++)

for(int i = 0; i <= p; i++)else}}

}}

result = 0;

}void solve ()}}

}if(d[t]==inf) break;

result += -(d[t]*a[t]);

int u = t;

while(u!=s)

}}int main(int argc, const char * argv)

深海機械人問題

這題的題面描述。有點問題。座標寫的很亂。這道題其實和著名dp問題方格取數很像qwq 我們發現機械人可以重複經過邊,但只能對答案貢獻一次,所以兩點間連兩條邊。一條是容量1帶的費用。另一條沒費用容量inf。用拆點嗎?不用的。因為這個權值是走過邊會有,所以這題中不用拆點。起點連s容量機械人,終點連t容量機...

深海機械人問題

費用流,兩個點間連費用為負價值容量為1的邊,再連費用為零容量為inf的邊,建立s,t,分別向起點終點連邊,跑最小費用流,對答案取反即可 水 include define rg register define il inline define fill a,b memset a,b,sizeof a ...

深海機械人問題

深海資源考察探險隊的潛艇將到達深海的海底進行科學考察。潛艇內有多個深海機械人。潛艇到達深海海底後,深海機械人將離開潛艇向預定目標移動。深海 機械人在移動中還必須沿途採集海底生物標本。沿途生物標本由最先遇到它的深海機械人完成採集。每條預定路徑上的生物標本的價值是已知的,而且生物標本只能 被採集一次。本...