太空飛行計畫
題目描述
輸入格式
2209.in
檔案第1行有2
個正整數m和
n。m是實驗數,
n是儀器數。接下來的
m行,每行是乙個實驗的有關資料。第乙個數贊助商同意支付該實驗的費用;接著是該實驗需要用到的若干儀器的編號。最後一行的
n個數是配置每個儀器的費用。
(1<=n, m<=50)
輸出格式
2209.out第1
行是實驗編號;第
2行是儀器編號;最後一行是淨收益。
輸入樣例
2209.in
2310 1 2
25 2 3
5 6 7
輸出樣例
2209.out
121 2 3
17關於這題的吐槽:
最坑的不是構圖or輸出方案,這題的輸入就夠人磨一陣子的了。因為在輸入了同意支付這個實驗的費用以後,接的是若干臺儀器。若干……簡直不想吐槽了,逼得只能用字串s直接輸入這一整行,然後再慢慢分解。結果單單輸入就直接佔了50多行的**位置。
解題思想:
關於這題的構圖方法要感謝ywq同學,講得挺通俗易懂。從收益上考慮。如果不做這個實驗,那就得不到這筆經費,會有所損失;如果做這台實驗,雖然經費的支柱,但是要買儀器,同樣會損失。而我們要做的就是看割哪一條邊會損失最小。
構圖:
把實驗編號放在左邊,與節點s連線,儀器編號放右邊,與節點t連線。跑一次最小割,得出來的就是消費最大的選擇。
注意,圖中的儀器編號已經向後移了m。
輸出方案:
最後在殘餘網路中,檢視,哪些邊被格調,即可以相連的兩條邊之間,v[now]是被選的(賦值為1),v[to]是不被選的,假設to是實驗,那麼說明不做這個實驗;如果是儀器,那麼說明選擇這台儀器。
那麼怎麼區別是實驗還是儀器呢?只要看它隔開的那條邊,即to是否為t,如果為,那麼說明是儀器,把這台now儀器標記為不取,否則,說明是實驗,那麼把to實驗標記為不取。
為了更清晰地表示為什麼實驗是to,儀器是now,回到上面的圖,復原一下會是怎麼割的,割掉的說明不取會更好。
看圖分析就比較直觀了。
**如下:
#include
#include
#include
#include
using namespace std;
const int maxn=205,oo=1000000000;
int m,n,s,t,ans,ma[maxn],ex[maxn],v[maxn],head[maxn],c[maxn],p[maxn],cur=-1;
string ss;
struct space
edge[maxn*maxn];
void add(int from,int to,int va,int type)
void init()//此處是麻煩的輸入
//存下資助的金額
int num=0;
j++;
while(j
>c[i]; for(int i=1;i<=m;i++) //資助金額與s相連 for(int i=m+1;i<=m+n;i++) //儀器與t相連 } int dfs(int now,int mi)//最大流(最小割) } h=edge[h].next; } return 0; } void check(int now)//掃一次殘餘網路。 check(to); } h=edge[h].next; } } void start()//輸出 cout<
太空飛行計畫問題
w 教授正在為國家航天中心計畫一系列的太空飛行。每次太空飛行可進行一系列商業性實驗而獲取利潤。現已確定了乙個可供選擇的實驗集合 e 和進行這些實驗需要使用的全部儀器的集合i 實驗 ej需要用到的儀器是i的子集j i。配置儀器ik的費用 為ck美元。實驗ej的贊助商已同意為該實驗結果支付pj美元。w教...
太空飛行計畫問題
網路流最小費用問題 一開始看這個人的部落格 寫了4天了,還是沒能寫出自己的 後面面還有在這個oj上ac了的 照著這個人的 打,還是沒能想明白。這個 和這個oj上的不同,是簡化問題了的。只求最大收益 照著打的 include include include include define inf 999...
太空飛行計畫問題
跟拍照幾乎是重題。在輸出部分,若最後一次bfs還能到這個點,則可以輸出。只要有乙個點可以從源點過得去,就可以通過正或反流到達所有經過的點。但是我不明白若把所有專案都割掉了,那不就嘎嘎了。這裡也求廣大讀者說出自己的理解。看 includeusing namespace std define inf 1...