懶得自己寫題解了。。。
這是我摘錄的別人的題解,跟我的思路一樣
【問題分析】
最大費用最大流問題。
【建模方法】
把網格中每個位置抽象成網路中乙個節點,建立附加源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 ...
深海機械人問題
深海資源考察探險隊的潛艇將到達深海的海底進行科學考察。潛艇內有多個深海機械人。潛艇到達深海海底後,深海機械人將離開潛艇向預定目標移動。深海 機械人在移動中還必須沿途採集海底生物標本。沿途生物標本由最先遇到它的深海機械人完成採集。每條預定路徑上的生物標本的價值是已知的,而且生物標本只能 被採集一次。本...