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 費用...