P2762 太空飛行計畫問題 網路流

2022-05-03 14:03:14 字數 3100 閱讀 2022

w 教授正在為國家航天中心計畫一系列的太空飛行。每次太空飛行可進行一系列商業性實驗而獲取利潤。現已確定了乙個可供選擇的實驗集合e=,和進行這些實驗需要使用的全部儀器的集合i=。實驗ej需要用到的儀器是i的子集rjíi。配置儀器ik的費用為ck美元。實驗ej的贊助商已同意為該實驗結果支付pj美元。w教授的任務是找出乙個有效演算法,確定在一次太空飛行中要進行哪些實驗並因此而配置哪些儀器才能使太空飛行的淨收益最大。這裡淨收益是指進行實驗所獲得的全部收入與配置儀器的全部費用的差額。

對於給定的實驗和儀器配置情況,程式設計找出淨收益最大的試驗計畫。

輸入格式:

第1行有2 個正整數m和n。m是實驗數,n是儀器數。接下來的m 行,每行是乙個實驗的有關資料。第乙個數贊助商同意支付該實驗的費用;接著是該實驗需要用到的若干儀器的編號。最後一行的n個數是配置每個儀器的費用。

輸出格式:

第1 行是實驗編號;第2行是儀器編號;最後一行是淨收益。

輸入樣例#1: 複製

2 3

10 1 2

25 2 3

5 6 7

輸出樣例#1: 複製

1 2

1 2 3

17

感謝@flierking 提供spj

n,m<=50

這道題資料是在windows生成的,輸入資料中所有的換行都是'\r\n'而不是'\n'

讀入某實驗需要用到的儀器編號的時候,可以這麼讀入。(感謝@zhouyonglong的提供)

char tools[10000

];memset(tools,

0,sizeof

tools);

cin.getline(tools,

10000

);int ulen=0

,tool;

while (sscanf(tools+ulen,"

%d",&tool)==1)//

之前已經用scanf讀完了贊助商同意支付該實驗的費用

}ulen++;

}

這個是乙個網路流的最小割問題,對於最小割的學習,推薦乙個部落格:

首先可以確定,最後一次分層之前,網路流裡已經沒有增廣路徑了,接著就退出while迴圈,這個很好理解。然後想想看為點分層的條件,乙個是還沒有分層,另乙個就是邊的容量大於0。再結合問題想想,如果我要做乙個實驗,那麼我必須要盈利,如果我得不到利益,我肯定不會去做對吧。放到圖里就是從源點流出一道流到對應的實驗,然後這個流分別流向這個實驗需要的儀器,在流到匯點時,儀器與匯點連線的邊的容量之和,一定要小於源點到實驗這條邊的容量,也就是說我的花費要小於我的利益,才能有收益。那麼對於容量大於0的邊(從源點到實驗對應的點),其實剩餘的容量就是我做這個實驗的收益了,這也可以解釋總收益減去最大流(即總花費)是淨收益。那些殘量為0的邊說明這個實驗得不到收益,那就不選,在分層時就不會分配到值。好了,那麼那些殘量大於0的邊所連的實驗就是要做的實驗了。至於儀器嘛,因為實驗與儀器之間的邊容量是inf,所以只要實驗選了,分了層了,它需要的儀器自然也會分到層。

#include #include 

#include

#include

#include

#include

#include

#include

#define inf 0x3f3f3f3f

using

namespace

std;

const

int maxn = 1e5 + 10

;struct

node

};vector

e;vector

g[maxn];

intlevel[maxn], iter[maxn];

intm;

void

init()

void add(int u,int v,int

c)void bfs(int

s) }

}}int dfs(int u,int v,int

f) }

}return0;

}int dinic(int s,int

t)

return

flow;

}vector

vec[110

];int a[110

];int

main()

}ulen++;}}

for (int i = 1; i <= m; i++)

int ans =dinic(s, t);

for (int i = 1; i <= n; i++) if (level[i] >= 0) printf("

%d "

, i);

printf("\n

");for (int i = 1; i <= m; i++) if (level[i + n] >= 0) printf("

%d "

,i);

printf("\n

");printf(

"%d\n

", sum -ans);

return0;

}/*首先可以確定,最後一次分層之前,網路流裡已經沒有增廣路徑了,接著就退出while迴圈,這個很好理解。

然後想想看為點分層的條件,乙個是還沒有分層,另乙個就是邊的容量大於0。再結合問題想想,如果我要做乙個實驗,

那麼我必須要盈利,如果我得不到利益,我肯定不會去做對吧。放到圖里就是從源點流出一道流到對應的實驗,

然後這個流分別流向這個實驗需要的儀器,在流到匯點時,儀器與匯點連線的邊的容量之和,一定要小於源點到實驗這條邊的容量,

也就是說我的花費要小於我的利益,才能有收益。那麼對於容量大於0的邊(從源點到實驗對應的點),

其實剩餘的容量就是我做這個實驗的收益了,這也可以解釋總收益減去最大流(即總花費)是淨收益。

那些殘量為0的邊說明這個實驗得不到收益,那就不選,在分層時就不會分配到值。

好了,那麼那些殘量大於0的邊所連的實驗就是要做的實驗了。至於儀器嘛,因為實驗與儀器之間的邊容量是inf,

所以只要實驗選了,分了層了,它需要的儀器自然也會分到層。 */

P2762 太空飛行計畫問題

本來是想做 noi2009的植物大戰殭屍來著,建了半天模型都沒又成功。於是看了看題解,發現這個問題叫做最大權閉合圖 我tm好像沒學過啊.於是先看了看概念,做了下入門的題目,然後一做就是一晚上 慘 我真不是頹了來著。這個題引入了最大權閉合圖的概念。乙個閉合圖的定義為圖中所有點的出邊的終點都在這個圖中。...

洛谷 P2762 太空飛行計畫問題

題目背景 題目描述 w 教授正在為國家航天中心計畫一系列的太空飛行。每次太空飛行可進行一系列商業性實驗而獲取利潤。現已確定了乙個可供選擇的實驗集合e 和進行這些實驗需要使用的全部儀器的集合i 實驗ej需要用到的儀器是i的子集rj i。配置儀器ik的費用為ck美元。實驗ej的贊助商已同意為該實驗結果支...

洛谷P2762 太空飛行計畫問題

這題套路好深.沒想渠。題意 給你若干個裝置,若干個任務。每個任務需要若干裝置,裝置可重複利用。完成任務有錢,買裝置要錢。問最大總收益 可以什麼任務都不做 解 最大權閉合子圖。對於乙個有向圖,如果選擇了乙個點,那麼就要選擇它的所有後繼節點。求最大權值和。建立s,t,記所有正權值和為sum。s向所有權值...