[洛谷P4012] [网络流24题] 深海机器人问题
Description
深海資源考察探險隊的潛艇將到達深海的海底進行科學考察。
潛艇內有多個深海機器人。潛艇到達深海海底后,深海機器人將離開潛艇向預定目標移動。
深海機器人在移動中還必須沿途采集海底生物標本。沿途生物標本由最先遇到它的深海機器人完成采集。
每條預定路徑上的生物標本的價值是已知的,而且生物標本只能被采集一次。
本題限定深海機器人只能從其出發位置沿著向北或向東的方向移動,而且多個深海機器人可以在同一時間占據同一位置。
用一個 P×Q 網格表示深海機器人的可移動位置。西南角的坐標為(0,0) ,東北角的坐標為(Q,P) 。
給定每個深海機器人的出發位置和目標位置,以及每條網格邊上生物標本的價值。
計算深海機器人的最優移動方案, 使深海機器人到達目的地后,采集到的生物標本的總價值最高。
Input
文件的第 11 行為深海機器人的出發位置數 a ,和目的地數 b 。
第 22 行為 P 和 Q 的值。
接下來的 P+1 行,每行有 Q 個正整數,表示向東移動路徑上生物標本的價值,行數據依從南到北方向排列。
再接下來的 Q+1 行,每行有 P 個正整數,表示向北移動路徑上生物標本的價值,行數據依從西到東方向排列。
接下來的 a 行,每行有 3 個正整數 k,x,y ,表示有 k 個深海機器人從 (x,y) 位置坐標出發。
再接下來的 b 行,每行有 3 個正整數 r,x,y ,表示有 r 個深海機器人可選擇 (x,y) 位置坐標作為目的地。
a行和b行輸入時橫縱坐標要反過來
Output
輸出采集到的生物標本的最高總價值.
Sample Input
1 1
2 2
1 2
3 4
5 6
7 2
8 10
9 3
2 0 0
2 2 2
Sample Output
42
HINT
1≤P,Q≤15
1≤a≤4
1≤b≤6
想法
還是挺容易的一道題
直接按題目所說的建圖,每相鄰兩個點間連兩條邊
一條容量為1,代價為-val
另一條容量為INF,代價為0
跑一遍最小費用最大流,答案\(\times\)-1就行了
代碼
#include<cstdio> #include<iostream> #include<algorithm> #include<queue>#define INF 2000000000using namespace std;typedef long long ll; const int N = 17; const int M = N*N;struct node{int v,f,c;node *next,*rev; }pool[M*8+20],*h[M],*pree[M]; int cnt;void addedge(int u,int v,int f,int c){node *p=&pool[++cnt],*q=&pool[++cnt];p->v=v;p->next=h[u];h[u]=p; p->f=f;p->c=c;p->rev=q;q->v=u;q->next=h[v];h[v]=q; q->f=0;q->c=-c;q->rev=p; }int S,T; ll d[M]; int vis[M],pre[M]; queue<int> que; bool spfa(){int u,v;while(!que.empty()) que.pop();for(int i=S;i<=T;i++) d[i]=INF;d[S]=0; vis[S]=1;que.push(S);while(!que.empty()){u=que.front(); que.pop(); vis[u]=0;for(node *p=h[u];p;p=p->next)if(p->f && d[v=p->v]>d[u]+p->c){d[v]=d[u]+p->c;pre[v]=u;pree[v]=p;if(!vis[v]) { que.push(v); vis[v]=1; } }} return d[T]!=INF; } void cal(ll &f,ll &c){int u=T,w=INF;node *p=pree[u];while(u!=S){w=min(w,p->f);u=pre[u]; p=pree[u]; }f+=w; c+=w*d[T];u=T; p=pree[u];while(u!=S){p->f-=w;p->rev->f+=w;u=pre[u]; p=pree[u]; } } ll MCMF(){ll f=0,c=0;while(spfa()) cal(f,c);return c; }int a,b,n,m;int main() {scanf("%d%d%d%d",&a,&b,&n,&m);n++;m++;S=0; T=n*m+1;int x,y,k;for(int i=1;i<=n;i++)for(int j=1;j<m;j++) {scanf("%d",&x);addedge((i-1)*m+j,(i-1)*m+j+1,1,-x);addedge((i-1)*m+j,(i-1)*m+j+1,INF,0);}for(int j=1;j<=m;j++)for(int i=1;i<n;i++) {scanf("%d",&x);addedge((i-1)*m+j,i*m+j,1,-x);addedge((i-1)*m+j,i*m+j,INF,0);}for(int i=0;i<a;i++){scanf("%d%d%d",&k,&x,&y);x++;y++;addedge(S,(x-1)*m+y,k,0); }for(int i=0;i<b;i++){scanf("%d%d%d",&k,&x,&y);x++;y++;addedge((x-1)*m+y,T,k,0); }printf("%lld\n",-MCMF());return 0; }轉載于:https://www.cnblogs.com/lindalee/p/8464536.html
總結
以上是生活随笔為你收集整理的[洛谷P4012] [网络流24题] 深海机器人问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大数据时代 | 数据分析方法及理论详解
- 下一篇: 1010. 一元多项式求导