洛谷P3356 火星探險問題 費用流

2022-04-30 15:12:13 字數 2895 閱讀 9783

火星探險隊的登陸艙將在火星表面著陸,登陸艙內有多部障礙物探測車。登陸艙著陸後,探測車將離開登陸艙向先期到達的傳送器方向移動。探測車在移動中還必須採集岩石標本。每一塊岩石標本由最先遇到它的探測車完成採集。每塊岩石標本只能被採集一次。岩石標本被採集後,其他探測車可以從原來岩石標本所在處通過。探測車不能通過有障礙的地面。本題限定探測車只能從登陸處沿著向南或向東的方向朝傳送器移動,而且多個探測車可以在同一時間佔據同一位置。如果某個探測車在到達傳送器以前不能繼續前進,則該車所採集的岩石標本將全部損失。

用乙個 p·q 網格表示登陸艙與傳送器之間的位置。登陸艙的位置在(x1,y1)處,傳送器

的位置在(xp ,yq)處。

x 1,y 1 x 2 , y 1 x 3 , y 1 ... x p-1, y 1 x p , y 1

x 1,y 2 x 2 , y 2 x 3 , y 2 ... x p-1, y 2 x p , y 2

x 1, y 3 x 2 , y 3 x 3 ,y 3 ... x p-1, y 3 x p , y 3

x 1 ,y q-1 x 2 , y q-1 x 3 , y q-1 ... x p-1, y q-1 x p , y q-1

x 1,y q x 2 , y q x 3 , y q ... x p-1, y q x p ,y q

給定每個位置的狀態,計算探測車的最優移動方案,使到達傳送器的探測車的數量最多,

而且探測車採集到的岩石標本的數量最多

輸入格式:

第 1行為探測車數,第 2 行為 p 的值,第3 行為q 的值。接下來的 q 行是表示登陸艙與傳送器之間的位置狀態的 p·q 網格。用 3 個數字表示火星表面位置的狀態:0 表示平坦無障礙,1表示障礙,2 表示石塊。

輸出格式:

每行包含探測車號和乙個移動方向,0 表示向南移動,1 表示向東移動。

輸入樣例#1: 複製

2108

0 0 0 0 0 0 0 0 0 0

0 0 0 0 0 1 1 0 0 0

0 0 0 1 0 2 0 0 0 0

1 1 0 1 2 0 0 0 0 1

0 1 0 0 2 0 1 1 0 0

0 1 0 1 0 0 1 1 0 0

0 1 2 0 0 0 0 1 0 0

0 0 0 0 0 0 0 0 0 0

輸出樣例#1: 複製

1 1

1 11 1

1 11 0

1 01 1

1 11 1

1 11 0

1 01 1

1 01 0

1 02 1

2 12 1

2 12 0

2 02 0

2 02 1

2 02 0

2 12 0

2 12 1

2 1

車數,p,q<=35

這題與深海機械人問題

不過也有不同

首先此問題是點權,因此我們考慮拆點

另外這題需要輸出方案

我們考慮利用發現邊的性質:反向邊有多少流量,就代表這個點被經過了多少次

因此我們可以利用反向邊來統計出該點的經過次數

然後列舉每乙個車,讓其沿邊走就好

#include#include

#include

#include

#include

#include

#define addedge(x,y,z,f) add_edge(x,y,z,f),add_edge(y,x,-z,0)

using

namespace

std;

const

int maxn=1e5+10

;const

int inf=1e8+10

;inline

intread()

while(c>='

0'&&c<='9')

return x*f;

}int

n,m,k,s,t;

int anscost=0

;struct

node

edge[maxn];

int head[maxn],num=2

;inline

void add_edge(int x,int y,int z,int

f)int

pre[maxn],vis[maxn],dis[maxn];

bool

spfa()}}

return dis[t]<=inf;

}void

f()void

mcmf()

int point=0

;int belong[1001][1001],can[1001][1001

];main()

s=0;t=point*4

; addedge(s,belong[

1][1],0

,k);

addedge(belong[n][m]+point,t,0

,k);

mcmf();

for(int i=1;i<=n;i++)

for(int j=1;j<=m;j++)

for(int k=head[belong[i][j]];k!=-1;k=edge[k].nxt)

if(edge[k].v==belong[i][j]+point)

can[i][j]+=edge[k^1

].f;

for(int kk=1;kk<=k;kk++)

}return0;

}

洛谷 P3356 火星探險問題

給出一張地圖,上面有一些石塊或障礙,現在有一些運載車從左上角出發,要去右下角,只能向右或向下走,每個石塊只能收集一次,輸出收集到最多石塊的路徑.多個運載車,不難想到是網路流,但難點在於每個石塊最多收集一次,而且要收集最多石塊.可以用費用流來做,每個點拆成兩個入點向出點連一條流量為inf,費用為0的邊...

網路流24題 23 洛谷P3356 火星探險問題

題意 q p q pq p的網格,有障礙 平坦地面 岩石標本,求從左上角到右下角最多運送車輛的情況下,運送的石子數最多,輸出車輛走的路徑。思路 35 35的圖很小,拆點建圖,有石子的一條邊容量為1,費用 1,另一條容量inf,費用0.最後的輸出答案跑n遍dfs,每次沿著flow 0的邊走到終點,並把...

網路流24題 火星探險問題(費用流)

cogs上沒有spj,這是洛谷的 loj也不錯 如果不考慮標本的採集 那麼,很容易的 直接相鄰點連邊就行了 現在,因為要考慮標本數最多 所以每個點要額外考慮乙個標本 但是標本又只能採集一次 所以,拆點,標本就額外的連一條容量1費用1的邊,表示可以採集一次,因為採集過之後又可以隨意走,和平地沒有區別 ...