太空飛行計畫

2021-08-06 05:09:33 字數 2167 閱讀 8898

太空飛行計畫

題目描述

輸入格式

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...