給你一張 \(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的邊走到終點,並把...