w 教授正在為國家航天中心計畫一系列的太空飛行。每次太空飛行可進行一系列商業性實驗而獲取利潤。現已確定了乙個可供選擇的實驗集合e=,和進行這些實驗需要使用的全部儀器的集合i=。實驗ej需要用到的儀器是i的子集rjíi。配置儀器ik的費用為ck美元。實驗ej的贊助商已同意為該實驗結果支付pj美元。w教授的任務是找出乙個有效演算法,確定在一次太空飛行中要進行哪些實驗並因此而配置哪些儀器才能使太空飛行的淨收益最大。這裡淨收益是指進行實驗所獲得的全部收入與配置儀器的全部費用的差額。
對於給定的實驗和儀器配置情況,程式設計找出淨收益最大的試驗計畫。
輸入格式:
第1行有2 個正整數m和n。m是實驗數,n是儀器數。接下來的m 行,每行是乙個實驗的有關資料。第乙個數贊助商同意支付該實驗的費用;接著是該實驗需要用到的若干儀器的編號。最後一行的n個數是配置每個儀器的費用。
輸出格式:
第1 行是實驗編號;第2行是儀器編號;最後一行是淨收益。
輸入樣例#1:
2 310 1 2
25 2 3
5 6 7
輸出樣例#1:
1 21 2 3
17準備開始入門網路流,盡快的刷完網路流24題吧。
這題其實是乙個最大流最小割定理的理解,
設所有沒有選擇的實驗專案的資金和為a,所有使用了的實驗儀器的資金和為b;
我們這個就是要想辦法將a+b變得盡可能得小;
於是我們想辦法建圖,
將實驗和儀器組成乙個二分圖;
建立源點和匯點,源點連向所有實驗,容量為c[i],所有儀器連向匯點,容量為p[i];
實驗和一起之間為權值為inf,源點和實驗的權值為經費,匯點和儀器的權值為**;
使得a+b盡可能得小,就是刪除剛剛建立的弧,一旦刪去了這些弧,整個網路將是不連通的。
然後就是跑乙個最大流。
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include7 #include 8
using
namespace
std;
9const
int maxn = 2e5 + 10;10
const
int inf = 1e9 + 10
;11 typedef long
long
ll;12
struct
node ;
15struct
dinic
26void
clearflow()
30void add(int
from, int to, int
cap) );
34nodes.push_back((node) );
37 m =nodes.size();
38 g[from].push_back(m - 2
);39 g[to].push_back(m - 1
);40}41
bool
bfs() 58}
59}60return
vis[t];61}
62int dfs(int x, int
a) 74}75
return
flow;76}
77int maxflow(int a, int
b) 85
return
flow;86}
87 vectormincut()
94return
ans;95}
96void
reduce()
100void display(int p, int
q) 112
} f;
113int
main()
131}
132for (int i = 1 ; i <= n ; i++)
137int ret = f.maxflow(0, n + m + 1
);138
f.display(n, m);
139 printf("
%d\n
", sum -ret);
140return0;
141 }
網路流24題 太空飛行計畫問題
網路流24題大多需要spj,所以需要乙個有spj的oj,本系列 均在www.oj.swust.edu.cn測試通過 最大權閉合子圖裸題,先將所有收益加起來,源點向每個方案連線一條收益的流,每個方案向對應需要的儀器連一條inf,每個儀器向匯點連一條花費的流。輸出方案只需要在最後的阻塞流中看還剩哪幾個點...
網路流24題 太空飛行計畫問題
已確定了乙個可供選擇的實驗集合e 和實驗需要使用的全部儀器的集合i 實驗ej需要用到的儀器是i的子集rj i。配置儀器ik的費用為ck美元。實驗ej的贊助商已同意為該實驗結果支付pj美元。w教授的任務是找出乙個有效演算法,確定在一次太空飛行中要進行哪些實驗並因此而配置哪些儀器才能使太空飛行的淨收益最...
太空飛行計畫問題 網路流24題
w 教授正在為國家航天中心計畫一系列的太空飛行。每次太空飛行可進行一系列商業性實驗而獲取利潤。現已確定了乙個可供選擇的實驗集合e 和進行這些實驗需要使用的全部儀器的集合i 實驗ej需要用到的儀器是i的子集rj i。配置儀器ik的費用為ck美元。實驗ej的贊助商已同意為該實驗結果支付pj美元。w教授的...