網路流24題 火星探險問題 題解

2022-05-16 11:36:15 字數 2396 閱讀 1844

給你一張 \(p \times q\) 的地圖,其上共有三種地形:

現在,有 \(n\) 輛探測車,它們只能向東或向南走,你需要在保證他們能夠到達終點的情況下,盡可能獲得多的岩石標本(注意:若探測車沒有到達終點,則其採集到的岩石標本作廢

顯然,此題可以用最大費用最大流解決。

//建圖(總結點數字2*p*q,源點位0,匯點為2*p*q+1)

//將所有點全部拆開

//拆開點之間的連邊:0->0,流量inf,費用0,1->1流量1,費用1

for(register int i=1;i<=p;i++)

//自己連線自己:u->u'

//對於岩石標本,建立兩組邊,第一組對答案產生貢獻的限流1,表示他只能被採集一次

//第二組表示岩石標本可以和普通地面一樣,可以在任意時刻抵達

if(mp[i][j]==2) add(u,u+p*q,1,1),add(u+p*q,u,0,-1); //當前節點為岩石標本

//初開障礙物外任何點可以任意到達

add(u,u+p*q,inf,0),add(u+p*q,u,0,0);

}}

對於路徑,我們只需要從 \((1,1)\) 處在殘次圖上跑一邊 \(dfs\) ,找到那些被流經的邊,將其列印下來即可

參考**如下:

inline void dfs(int x,int y,int u,int k)

//如果到達i'即連線其他點的拆點

if(to==get_id(x,y)+1) kx=x,ky=y+1,mov=1; //判斷走向了哪乙個點

else kx=x+1,ky=y,mov=0;

printf("%d %d\n",k,mov);

dfs(kx,ky,to+p*q,k); //遞迴

return;

}}

本題的 \(p\) 和 \(q\) 的輸入順序,先輸入的列,再輸入的行,我調了一年才發現,簡直服了。

#include using namespace std;

const int n=1e2,inf=0x3f3f3f3f;

const int dx[2]=,dy[2]=;

int n,p,q;

int s,t,ans,maxf;

int mp[n][n];

inline int read()

while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();

return s*w;

}int tot=-1,v[n*n*n],w[n*n*n],pay[n*n*n],nex[n*n*n],first[2*n*n];

inline void add(int x,int y,int z,int c)

inline int get_id(int x,int y)

bool vis[2*n*n];

//min[i]表示到達點i經過的邊流量最小的乙個

int dis[2*n*n],pre[2*n*n],min[2*n*n];

inline bool spfa()

//如果到達i'即連線其他點的拆點

if(to==get_id(x,y)+1) kx=x,ky=y+1,mov=1; //判斷走向了哪乙個點

else kx=x+1,ky=y,mov=0;

printf("%d %d\n",k,mov);

dfs(kx,ky,to+p*q,k); //遞迴

return; }}

int main()

//自己連線自己:u->u'

//對於岩石標本,建立兩組邊,第一組對答案產生貢獻的限流1,表示他只能被採集一次

//第二組表示岩石標本可以和普通地面一樣,可以在任意時刻抵達

if(mp[i][j]==2) add(u,u+p*q,1,1),add(u+p*q,u,0,-1); //當前節點為岩石標本

//初開障礙物外任何點可以任意到達

add(u,u+p*q,inf,0),add(u+p*q,u,0,0);

} }if(mp[1][1]!=1) add(s,1,n,0),add(1,s,0,0);

if(mp[p][q]!=1) add(get_id(p,q)+p*q,t,n,0),add(t,get_id(p,q)+p*q,0,0);

ek();

for(register int i=1;i<=maxf;i++) dfs(1,1,1,i);

return 0;

}

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

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

題解 網路流24題

網路流 24 題,是網路流部分的十分經典的重要練習。以下根據其知識點和難度分類,各位可以根據自身情況選擇練習。後續將會把題目解析陸續補上。題目鏈結 知識點優先度 p1251 餐巾計畫問題 拆點 費用流 p2754 ctsc1999 家園 星際轉移問題 分層 最大流 費用流 p2756 飛行員配對方案...

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

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