洛谷P2762 太空飛行計畫問題

2022-04-30 11:36:07 字數 1938 閱讀 5559

這題套路好深......沒想渠。

題意:給你若干個裝置,若干個任務。

每個任務需要若干裝置,裝置可重複利用。

完成任務有錢,買裝置要錢。

問最大總收益(可以什麼任務都不做)。

解:最大權閉合子圖。

對於乙個有向圖,如果選擇了乙個點,那麼就要選擇它的所有後繼節點。求最大權值和。

建立s,t,記所有正權值和為sum。

s向所有權值為正的點連邊,流量為權值。

所有權值為負的點向t連邊,流量為權值的絕對值。

對於所有邊,建立流量inf的邊。

答案即為sum - 最小割。

證明:你割的邊顯然只能與s或t相連。

如果割了s -> a,表示不選a。

如果割了b -> t,表示選b。

那麼如果你選了乙個點c,那麼就沒割,那麼c的所有後繼節點肯定都割了。

大概就是這樣...意會一下吧。

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 78

const

int n = 107, m = 1000010, inf = 0x3f3f3f3f;9

10struct

edge edge[m << 1]; int top = 1;13

14int

e[n], d[n], use[n];

15 std::queueq;

16 std::string

str;

1718 inline void add(int x, int y, int

z) 32

33 inline bool bfs(int s, int

t) 45 d[y] = d[x] + 1;46

q.push(y);47}

48}49return

d[t];50}

5152

int dfs(int x, int t, int

maxf)

56int ans = 0;57

for(int i = e[x]; i; i =edge[i].nex)

62int temp = dfs(y, t, std::min(edge[i].c, maxf -ans));

63if(!temp)

66 ans +=temp;

67 edge[i].c -=temp;

68 edge[i ^ 1].c +=temp;

69if(ans ==maxf) 72}

73return

ans;74}

7576 inline int solve(int s, int

t) 81

return

ans;82}

8384 inline void read(int *a)

93else

98else

101}

102}

103return

;104

}105

106int

main()

117 sum +=x;

118}

119for(int i = 1, x; i <= n; i++)

123124

int ans =solve(s, t);

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

129}

130 puts(""

);131

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

135}

136 printf("

\n%d

", sum -ans);

137return0;

138 }

ac**

洛谷 P2762 太空飛行計畫問題

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

P2762 太空飛行計畫問題

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

洛谷P2762 太空飛行計畫問題(最小割)

傳送門 總而言之,就是求乙個圖,每乙個點有點權,閉合圖就是若圖中有點 u 且原圖中存在邊 u,v 那麼點 v 也在圖中。然後求乙個最大權的閉合圖即可 具體證明看上面 最大權閉合圖可以轉化成下面那樣建圖之後求最小割 源點向所有實驗連邊,容量為收益,實驗向對應儀器連邊,容量為 inf 儀器向匯點連邊,容...