1. 程式人生 > >【網路流24題】火星探險問題(費用流)

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

題面

題解

如果不考慮標本的採集
那麼,很容易的
直接相鄰點連邊就行了

現在,因為要考慮標本數最多
所以每個點要額外考慮一個標本
但是標本又只能採集一次
所以,拆點,標本就額外的連一條容量1費用1的邊,
表示可以採集一次,
因為採集過之後又可以隨意走,和平地沒有區別
所以拆的點之間再連一條容量為INF,費用為0的邊

然後跑最大費用最大流
輸出方案跑一遍DFS

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm> #include<set> #include<map> #include<vector> #include<queue> using namespace std; #define MAX 50000 #define MAXL 500000 #define INF 1000000000 inline int read() { int x=0,t=1;char ch=getchar(); while((ch<'0'||ch>'9')&&ch!='-')ch=getchar(); if(ch=='-'
)t=-1,ch=getchar(); while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar(); return x*t; } struct Line { int v,next,w,fy; }e[MAXL]; int h[MAX],cnt=2; inline void Add(int u,int v,int w,int fy) { e[cnt]=(Line){v,h[u],w,fy};h[u]=cnt++; e[cnt]=(Line){u,h[v],0,-fy};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() { memset(dis,63,sizeof(dis)); queue<int> Q; Q.push(S);dis[S]=0; while(!Q.empty()) { int u=Q.front();Q.pop(); for(int i=h[u];i;i=e[i].next) { int v=e[i].v; if(e[i].w&&dis[v]>dis[u]+e[i].fy) { dis[v]=dis[u]+e[i].fy; pe[v]=i;pr[v]=u; if(!vis[v])vis[v]=true,Q.push(v); } } 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){return x*m+y-m;} int K,g[50][50]; void DFS(int x,int y) { int now=Cnt(x,y),d0=Cnt(x+1,y),d1=Cnt(x,y+1); for(int i=h[now+n*m];i;i=e[i].next) { if(ff[i]>=e[i^1].w)continue;//流滿 if(e[i].v==d0) { ff[i]++;ss[++tt]=0; DFS(x+1,y); return; } else if(e[i].v==d1) { ff[i]++;ss[++tt]=1; DFS(x,y+1); return; } } } int main() { K=read();m=read();n=read(); S=0;T=n*m*2+1; Add(S,1,K,0); for(int i=1;i<=n;++i) for(int j=1;j<=m;++j) { g[i][j]=read(); if(g[i][j]==2)Add(Cnt(i,j),Cnt(i,j)+n*m,1,-1); } 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) { if(g[i][j]==1)continue; if(i!=n&&g[i+1][j]!=1)Add(Cnt(i,j)+n*m,Cnt(i+1,j),INF,0); if(j!=m&&g[i][j+1]!=1)Add(Cnt(i,j)+n*m,Cnt(i,j+1),INF,0); } while(SPFA()); for(int i=1;i<=Flow;++i) { tt=0;DFS(1,1); for(int j=1;j<=tt;++j)printf("%d %d\n",i,ss[j]); } return 0; }

相關推薦

網絡24運輸問題費用網絡費用流量

size tle 輸出 main pre algorithm 流量 out text 【網絡流24題】運輸問題 2014年3月7日1,6360 題目描述 Description W 公司有m個倉庫和n 個零售商店。第i 個倉庫有ai 個單位的貨物;第j

網絡24運輸問題費用

return 。。 size define max freopen markdown %d true 【網絡流24題】運輸問題(費用流) 題面 Cogs 題解 大水題。。。 源點向倉庫連,容量為貨物量,費用為0 倉庫向商店連,容量INF,費用題目給出來了 商店向匯點連,容量

網絡24分配問題費用

while urn += vector sizeof size line cstring ron 【網絡流24題】分配問題(費用流) 題面 Cogs 題解 這。。。。二分圖最大帶權匹配呀 KM可以直接AC 懶得寫了 一個費用流跑過去了 和運輸問題一毛一樣呀。。。 #incl

網路24火星探險問題費用

題面 題解 如果不考慮標本的採集 那麼,很容易的 直接相鄰點連邊就行了 現在,因為要考慮標本數最多 所以每個點要額外考慮一個標本 但是標本又只能採集一次 所以,拆點,標本就額外的連一條容量1費用1的邊, 表示可以採集一次, 因為採集過之後

網路24火星探險問題

由於這道題的輸出太過龐大而且之前提供的oj也沒有spj,無法驗證程式碼正確性,所以這道題僅提供思路,就不附程式碼了,這道題其實和之前幾道網格題是挺像的,只不過這道題有的地方有石頭,有的地方沒有石頭,有的地方還不能走,那麼我們就像之前的那樣建圖,把一個點拆分成兩個

[網路24]負載平衡問題 費用

題目描述 G公司n個沿鐵路運輸線環形排列的倉庫,每個倉庫儲存的貨物數量不等。如何用最少搬運量可以使n 個倉庫的庫存數量相同。搬運貨物時,只能在相鄰的倉庫之間搬運。 輸入輸出格式 輸入格式: 檔案的第1 行中有1 個正整數 n ,表示有 n 個倉庫。第 2

網路24餐巾計劃最小費用最大

題意 一個餐廳在相繼的 nnn 天裡,每天需用的餐巾數不盡相同。假設第 iii 天需要 rir_iri​​​ 塊餐巾。餐廳可以購買新的餐巾,每塊餐巾的費用為 PPP 分;或者把舊餐巾送到快洗部,洗一塊需 MMM天,其費用為 FFF 分;或者送到慢洗部,洗一塊需

網路24運輸問題最小費用最大

題意 W 公司有 mmm 個倉庫和 nnn 個零售商店。第 iii 個倉庫有 aia_iai​​​ 個單位的貨物;第 jjj 個零售商店需要 bjb_jbj​​​ 個單位的貨物。貨物供需平衡,即∑i=1mai=∑j=1nbj​​\sum\limits_{i =

網路24試題庫二分圖+最大

傳送門     試題庫 I think     點集x,y分別放置試題與型別。源點向x集點連容量為1的邊,x集點向y中其所屬型別連容量為1的邊,y集點向T連容量為所需量的邊,求解最大流若等於總題數

網路2423. 火星探險問題

火星探險問題 Description 火星探險隊的登陸艙將在火星表面著陸,登陸艙內有多部障礙物探測車。登陸艙著陸後,探測車將離開登陸艙向先期到達的傳送器方向移動。探測車在移動中還必須採集岩石標本。每一塊岩石標本由最先遇到它的探測車完成採集。每塊岩石標本只

網路 24 火星探險問題。

#6225. 「網路流 24 題」火星探險問題 記憶體限制:256 MiB 時間限制:1000 ms 標準輸入輸出 題目型別:傳統 評測方式:Special Judge 上傳者: 匿名 題目描述 火星探險隊的登陸艙將在火星表面著陸,登陸艙內有多部障礙物探測車。 登

網絡24圓桌聚餐最大

cpp pan pos har pre cst ++ get post 【網絡流24題】圓桌聚餐(最大流) 題面 Cogs 題解 這道題很簡單 首先每個單位的人數限制 直接從源點向單位連邊,容量為人數 同樣的, 每個桌子向匯點連邊,容量為可以坐的人數 因為每個桌子只能夠做一

網路24飛行員配對方案問題

題目描述 英國皇家空軍從淪陷國徵募了大量外籍飛行員。由皇家空軍派出的每一架飛機都需要配備在航行技能和語言上能互相配合的2 名飛行員,其中1 名是英國飛行員,另1名是外籍飛行員。在眾多的飛行員中,每一名外籍飛行員都可以與其他若干名英國飛行員很好地配合。如何選擇配對飛行的飛行員才能使一次派出最多的飛機。對於給定

網路24最小路徑覆蓋問題-二分圖匹配/最大

傳送門:luogu P2764 最小路徑覆蓋問題 題解 結論: D A G

網路24魔術球問題

題目: 假設有n根柱子,現要按下述規則在這n根柱子中依次放入編號為1,2,3,…的球。 (1)每次只能在某根柱子的最上面放球。 (2)在同一根柱子中,任何2個相鄰球的編號之和為完全平方數。 試設計一個演算法,計算出在n根柱子上最多能放多少個球。例如,在4 根柱子

2018.10.22網路24洛谷P2770LOJ6122航空路線問題費用

洛谷傳送門 解析: 調了半天最後發現費用流部分一個小細節跪了。。。 心態爆炸。。。問題不大 思路: 首先我們直接找出兩條沒有重複節點的路徑,一條正著輸出一條倒著輸出就行了。 找的話考慮網路流。我們將每個點拆點成兩個ai,bia_i,b_iai​,bi​,為保

網路24 No.10 餐巾計劃問題 線性規劃網路優化 最小費用最大

【題意】   一個餐廳在相繼的 N 天裡, 每天需用的餐巾數不盡相同。 假設第 i 天需要 ri 塊餐巾(i=1,2,…, N)。 餐廳可以購買新的餐巾,每塊餐巾的費用為 p 分;或者把舊餐巾送到快洗部,洗一塊需 m 天,其費用為 f分;或者送到慢洗部, 洗一塊需 n 天(n>m),其費用為 s<

網路24孤島營救問題

(網路流24題大多需要spj,所以需要一個有spj的oj,本系列程式碼均在www.oj.swust.edu.cn測試通過) 又是一道混進來的奇奇怪怪的東西,想起來以前做過這道題,用的是bfs,所以就不想寫了,附上之前的程式碼。 #include<cs

LibreOJ6003網路24魔術球問題 的通項公式與線性解法

假設有 n 根柱子,現要按下述規則在這n 根柱子中依次放入編號為1,2,3,4,⋯的球。每次只能在某根柱子的最上面放球。在同一根柱子中,任何 2 個相鄰球的編號之和為完全平方數。試設計一個演算法,計算出在 n 根柱子上最多能放多少個球。這道題有貪心做法,由於答案的數量是O(n

網路 24 方格取數二分圖的最大點權獨立集

題意 在一個有 m×nm \times nm×n個方格的棋盤中,每個方格中有一個正整數。 現要從方格中取數,使任意 222 個數所在方格沒有公共邊,且取出的數的總和最大。試設計一個滿足要求的取數演算法。 題解 題目要求不相鄰,可以轉換為最大獨立集,又由於點權不全