【問題描述】
w 教授正在為國家航天中心計畫一系列的太空飛行。每次太空飛行可進行一系列商業性實驗而獲取利潤。現已確定了乙個可供選擇的實驗集合e=,和進行這些實驗需要使用的全部儀器的集合i=。實驗ej 需要用到的儀器是i的子集rj∈i。配置儀器ik 的費用為ck 美元。實驗ej 的贊助商已同意為該實驗結果支付pj 美元。w教授的任務是找出乙個有效演算法,確定在一次太空飛行中要進行哪些實驗並因此而配置哪些儀器才能使太空飛行的淨收益最大。這裡淨收益是指進行實驗所獲得的全部收入與配置儀器的全部費用的差額。
【程式設計任務】
對於給定的實驗和儀器配置情況,程式設計找出淨收益最大的試驗計畫。
【資料輸入】
第1行有2個正整數m和n(m,n <= 100)。m是實驗數,n是儀器數。接下來的m行,每行是乙個實驗的有關資料。第乙個數贊助商同意支付該實驗的費用;接著是該實驗需要用到的若干儀器的編號。最後一行的n個數是配置每個儀器的費用。
【結果輸出】
第1行是實驗編號;第2行是儀器編號;最後一行是淨收益。
【輸入檔案示例】shuttle.in
2 310 1 2
25 2 3
5 6 7
【輸出檔案示例】shuttle.out
1 21 2 3
17【題解】
最大權閉合圖,最大權值就是tot-最小割,跑一遍dinic就行了。
至於輸出方案,用貪心的思路,level不為0的點就是了。
吐槽:這題的輸入非常奇葩,用一下**,可能執行不了,但在cojs上能過,如果要在本地執行,請使用被注釋掉的部分。
#include#include#include
#include
#include
#include
#include
using
namespace
std;
#define maxn 250*2
#define inf 1000000000
struct nodee[maxn];
intn,m,s,t,len,sum,ans,link[maxn],level[maxn],q[maxn];
inline
intread()
while(isdigit(ch))
return x*f;
}void insert(int x,int y,int
v)bool
bfs()
}return level[t]>=0;}
int dinic(int x,int
flow)
if(!maxflow) level[x]=-1
;
return
maxflow;
}void
solve()
intmain()
intx,y;
while(scanf("
%d%c
",&x,&y))
}for(int i=1;i<=m;i++)
solve();
for(int i=1;i<=n;i++) if(level[i]!=-1) printf("
%d ",i); printf("\n"
);
for(int i=1;i<=m;i++) if(level[i+n]!=-1) printf("
%d ",i); printf("\n"
); printf(
"%d\n
",sum-ans);
return0;
}
網路流24題 太空飛行計畫
題目 洛谷p2762 解法 考慮網路流建模。設定點 1 1 n role presentation style position relative n n表示每種儀器,點n 1 n 1 n m n m 表示每個專案,超源 s s 超匯t role presentation style positio...
網路流24題 太空飛行計畫問題
網路流24題大多需要spj,所以需要乙個有spj的oj,本系列 均在www.oj.swust.edu.cn測試通過 最大權閉合子圖裸題,先將所有收益加起來,源點向每個方案連線一條收益的流,每個方案向對應需要的儀器連一條inf,每個儀器向匯點連一條花費的流。輸出方案只需要在最後的阻塞流中看還剩哪幾個點...
網路流24題 太空飛行計畫問題
已確定了乙個可供選擇的實驗集合e 和實驗需要使用的全部儀器的集合i 實驗ej需要用到的儀器是i的子集rj i。配置儀器ik的費用為ck美元。實驗ej的贊助商已同意為該實驗結果支付pj美元。w教授的任務是找出乙個有效演算法,確定在一次太空飛行中要進行哪些實驗並因此而配置哪些儀器才能使太空飛行的淨收益最...