w 教授正在為國家航天中心計畫一系列的太空飛行。每次太空飛行可進行一系列商業性實驗而獲取利潤。現已確定了乙個可供選擇的實驗集合e=,和進行這些實驗需要使用的全部儀器的集合i=。實驗ej需要用到的儀器是i的子集rjíi。配置儀器ik的費用為ck美元。實驗ej的贊助商已同意為該實驗結果支付pj美元。w教授的任務是找出乙個有效演算法,確定在一次太空飛行中要進行哪些實驗並因此而配置哪些儀器才能使太空飛行的淨收益最大。這裡淨收益是指進行實驗所獲得的全部收入與配置儀器的全部費用的差額。
對於給定的實驗和儀器配置情況,程式設計找出淨收益最大的試驗計畫。
輸入格式:
第1行有2 個正整數m和n。m是實驗數,n是儀器數。接下來的m 行,每行是乙個實驗的有關資料。第乙個數贊助商同意支付該實驗的費用;接著是該實驗需要用到的若干儀器的編號。最後一行的n個數是配置每個儀器的費用。
輸出格式:
第1 行是實驗編號;第2行是儀器編號;最後一行是淨收益。
思路:首先考慮二分圖模型,把實驗和儀器分為兩個集合,a,b,原點src向a集合建立一條容量為該實驗贊助費用的邊,匯點sink與b集合之間建立容量為儀器費用的邊,而實驗和實驗所需要的儀器之間建立容量為無窮的邊,這裡每一種割都是一種方案。我們可以發現這裡割的值就等於已經選的儀器的價值+未被選的實驗的價值,而我們要求的ans就是所有實驗的價值-(已經選的儀器的價值+未被選的實驗的價值)=已經選的實驗-已經選的儀器,為了讓ans最大,我們就讓割值最小,這就變成了乙個最小割模型。(%%%%%%%)
#includeusing namespace std;
const int inf=1000000000;
const int maxn=20000,maxm=1e6+10;
struct edge;
int src,sink;
int g[maxn+10];
int nume;
edge e[maxm*2+10];
void addedge(int u,int v,int c)
void init()
queueque;
bool vis[maxn+10];
int dist[maxn+10];
int n,m,k,dfn;
int h[maxn];
int a[maxn][30];
bool bfs() }}
return vis[sink];
}int dfs(int u,int delta)
else
}return ret;
}}int maxflow()
}char c[maxn];
int to[maxn];
int in[maxn];
int val[maxn];
int main() */
/**for (int i=1;i<=n;i++)
ulen++;
}}*/
for(int i=1;i<=m;i++)
for(int i=1;i<=m;i++)
ans=ans-maxflow();
for(int i=1;i<=n;i++)
puts("");
for(int i=1;i<=m;i++)
puts("");
printf("%d\n",ans);
}
網路流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教授的...