description
w教授正在為國家航天中心計畫一系列的太空飛行。每次太空飛行可進行一系列商業性實驗而獲取利潤。現已確定了乙個可供選擇的實驗集合e=,和進行這些實驗需要使用的全部儀器的集合i=。實驗ej需要用到的儀器是i的子集。配置儀器ik的費用為ck美元。實驗ej的贊助商已同意為該實驗結果支付pj美元。w教授的任務是找出乙個有效演算法,確定在一次太空飛行中要進行哪些實驗並因此而配置哪些儀器才能使太空飛行的淨收益最大。這裡淨收益是指進行實驗所獲得的全部收入與配置儀器的全部費用的差額。
input
多組資料輸入.
每組輸入第1行有2 個正整數m和n。m是實驗數,n是儀器數。接下來的m 行,每行是乙個實驗的有關資料。第乙個數贊助商同意支付該實驗的費用;接下來是該實驗需要的儀器數;接著是對應儀器的編號。最後一行的n個數是配置每個儀器的費用。
output
每組輸出最佳實驗方案的淨收益
sample input
2 3
10 2 1 2
25 2 2 3
5 6 7
sample output
17 題目出自nefu476
思路:這道題目是最大權閉合圖,利潤是實驗的經費-最大權閉合圖的權值(最小割)
源點連實驗,權值為經費,實驗連對應的儀器權值為無窮大,儀器連匯點,權值為儀器的費用,這樣就可以建圖了
#include#include#include using namespace std;
const
int oo=1e9;
/**oo 表示無窮大*/
const
int mm=99999999;
/**mm 表示邊的最大數量,記住要是原圖的兩倍,在加邊的時候都是雙向的*/
const
int mn=999;
/**mn 表示點的最大數量*/
struct sa
yiqi[mn];
struct sa2
shiyan[mn];
int node,src,dest,edge;
/**node 表示節點數,src 表示源點,dest 表示匯點,edge 統計邊數*/
int ver[mm],flow[mm],next[mm];
/**ver 邊指向的節點,flow 邊的容量 ,next 鍊錶的下一條邊*/
int head[mn],work[mn],dis[mn],q[mn];
void prepare(int _node, int _src,int _dest)
/**增加一條 u 到 v 容量為 c 的邊*/
void addedge( int u, int v, int c)
/**廣搜計算出每個點與源點的最短距離,如果不能到達匯點說明演算法結束*/
bool dinic_bfs()
return0;}
/**尋找可行流的增廣路演算法,按節點的距離來找,加快速度*/
int dinic_dfs( int u, int exp)
return0;}
int dicnic_flow()
}return ret;
}int main()
}for(int i=1;i<=n;i++)
for(int i=1;i<=m;i++)
}int flag[mn];
memset(flag,0,sizeof(flag));
for(int i=1;i<=n;i++)
}*/addedge(i+m,n+m+1,yiqi[i].val);
}int sum=ans-dicnic_flow();
cout0;}
網路流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教授的...