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

2022-03-20 08:16:30 字數 1532 閱讀 1669

cogs上沒有spj,這是洛谷的

loj也不錯

如果不考慮標本的採集

那麼,很容易的

直接相鄰點連邊就行了

現在,因為要考慮標本數最多

所以每個點要額外考慮乙個標本

但是標本又只能採集一次

所以,拆點,標本就額外的連一條容量1費用1的邊,

表示可以採集一次,

因為採集過之後又可以隨意走,和平地沒有區別

所以拆的點之間再連一條容量為inf,費用為0的邊

然後跑最大費用最大流

輸出方案跑一遍dfs

#include#include#include#include#include#include#include#include#include#includeusing namespace std;

#define max 50000

#define maxl 500000

#define inf 1000000000

inline int read()

struct line

e[maxl];

int h[max],cnt=2;

inline void add(int u,int v,int w,int fy)

;h[u]=cnt++;

e[cnt]=(line);h[v]=cnt++;

}int pe[max],pr[max],dis[max];

bool vis[max];

int s,t,cost,n,m,flow,sum;

int ff[maxl];

int ss[max],tt=0;

bool spfa()

}vis[u]=false;

}if(dis[t]>=inf)return false;

int flow=inf;

for(int i=t;i!=s;i=pr[i])flow=min(flow,e[pe[i]].w);

for(int i=t;i!=s;i=pr[i])e[pe[i]].w-=flow,e[pe[i]^1].w+=flow;

cost-=flow*dis[t];

flow+=flow;

return true;

}int cnt(int x,int y)

int k,g[50][50];

void dfs(int x,int y)

else if(e[i].v==d1)

}}int main()

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

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

if(g[i][j]!=1)add(cnt(i,j),cnt(i,j)+n*m,inf,0);

add(t-1,t,k,0);

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

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

while(spfa());

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

return 0;

}

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

給你一張 p times q 的地圖,其上共有三種地形 現在,有 n 輛探測車,它們只能向東或向南走,你需要在保證他們能夠到達終點的情況下,盡可能獲得多的岩石標本 注意 若探測車沒有到達終點,則其採集到的岩石標本作廢 顯然,此題可以用最大費用最大流解決。建圖 總結點數字2 p q,源點位0,匯點為2...

網路流24題 運輸問題(費用流)

cogs 大水題。源點向倉庫連,容量為貨物量,費用為0 倉庫向商店連,容量inf,費用題目給出來了 商店向匯點連,容量為需求量,費用為0 簡直裸的費用流 include include include include include include include include include i...

網路流24題 航空路線問題 費用流

洛谷傳送門 loj傳送門 這道題的圖還挺好想的吧 反正都是無向邊,起點走到終點再回到起點,就相當於從起點走 2 次到達終點,且這兩次不經過相同的點,還要經過盡可能多的點 很經典的費用流建圖 限制點通過次數 拆點連邊,流量為 1 費用為 1 圖中的其他邊,編號較小的指向編號較大的,流量為 inf 費用...