本來是想做 noi2009的植物大戰殭屍來著,建了半天模型都沒又成功。
於是看了看題解,發現這個問題叫做最大權閉合圖
我tm好像沒學過啊.
於是先看了看概念,做了下入門的題目,然後一做就是一晚上(慘~
我真不是頹了來著。
這個題引入了最大權閉合圖的概念。乙個閉合圖的定義為圖中所有點的出邊的終點都在這個圖中。乙個圖的最大權閉合子圖為其中所有閉合子圖中權值和最大的。
本題的實質就是求最大權閉合圖,試按照實驗-儀器的關係建圖,並將它們的收益(如果要花錢,則為負值)標註在點上。這個圖應當形如以下示例。
要求本圖上的最大權閉合圖,就要先將原圖中的正值點連向源點s,容量為點權,負值點連向匯點t,容量為點權的絕對值,例如下圖示例。
需要用到的定理:
1.最大流==最小割
2.最小割分割成的兩個圖中,源點s所在的那個圖是最大權閉合圖。
在本題裡,我們需要從源點向每個實驗建一條容量為價值的邊
從實驗向所需器材建一條容量為inf的邊
從器材向匯點連一條容量為花費的邊
然後跑最大流。
答案即為所以實驗的總價值-最大流。
為什麼???
我們可以想象,要實現最小割,就要割掉最小的實驗邊和最小的器材邊。
這些實驗是沒有實現的,而這些器材是用到的。
那麼總的收入就等於總代價-沒有實現的代價-器材帶來的成本
可以看最後一次查出阻塞流的時候有哪些點被bfs遍歷到了,如果被遍歷到了說明跟源點s在乙個子圖內
本**補充一下,其實是在linux下進行測試,不是出題人故意的.
cogs
luogu
#include
#include
#include
#include
#define il inline
using
namespace
std;
const
int inf=0x7fffffff;
const
int maxm=110000;
int head[maxm],to[maxm*2],cap[maxm*2],net[maxm*2],deep[maxm],cnt=1;
il void add(int x,int y,int c)
queue
dl;int vis[maxm];
il bool bfs(int s,int t)
return deep[t]==-1?0:1;
}int dfs(int now,int flow,int t)
}if(!used) deep[now]=-1;
return used;
}il int dinic(int s,int t)
inline
void adx(int x,int y,int cax)
inline
bool read(int &res)
while (isdigit(ch))
if (ch == '\r') return
false; else
return
true;
}int main()
for(int i=1,c;i<=m;i++) read(c),adx(i+n,t,c);
int ans=dinic(s,t);
for(int i=1;i<=n;i++)
if(deep[i]!=-1) printf("%d ",i);
puts("");
for(int i=1;i<=m;i++)
if(deep[i+n]!=-1) printf("%d ",i);
puts("");
printf("%d\n",sum-ans);
return
0;}
洛谷 P2762 太空飛行計畫問題
題目背景 題目描述 w 教授正在為國家航天中心計畫一系列的太空飛行。每次太空飛行可進行一系列商業性實驗而獲取利潤。現已確定了乙個可供選擇的實驗集合e 和進行這些實驗需要使用的全部儀器的集合i 實驗ej需要用到的儀器是i的子集rj i。配置儀器ik的費用為ck美元。實驗ej的贊助商已同意為該實驗結果支...
洛谷P2762 太空飛行計畫問題
這題套路好深.沒想渠。題意 給你若干個裝置,若干個任務。每個任務需要若干裝置,裝置可重複利用。完成任務有錢,買裝置要錢。問最大總收益 可以什麼任務都不做 解 最大權閉合子圖。對於乙個有向圖,如果選擇了乙個點,那麼就要選擇它的所有後繼節點。求最大權值和。建立s,t,記所有正權值和為sum。s向所有權值...
P2762 太空飛行計畫問題 網路流
w 教授正在為國家航天中心計畫一系列的太空飛行。每次太空飛行可進行一系列商業性實驗而獲取利潤。現已確定了乙個可供選擇的實驗集合e 和進行這些實驗需要使用的全部儀器的集合i 實驗ej需要用到的儀器是i的子集rj i。配置儀器ik的費用為ck美元。實驗ej的贊助商已同意為該實驗結果支付pj美元。w教授的...