這題套路好深......沒想渠。
題意:給你若干個裝置,若干個任務。
每個任務需要若干裝置,裝置可重複利用。
完成任務有錢,買裝置要錢。
問最大總收益(可以什麼任務都不做)。
解:最大權閉合子圖。
對於乙個有向圖,如果選擇了乙個點,那麼就要選擇它的所有後繼節點。求最大權值和。
建立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 78ac**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 }
洛谷 P2762 太空飛行計畫問題
題目背景 題目描述 w 教授正在為國家航天中心計畫一系列的太空飛行。每次太空飛行可進行一系列商業性實驗而獲取利潤。現已確定了乙個可供選擇的實驗集合e 和進行這些實驗需要使用的全部儀器的集合i 實驗ej需要用到的儀器是i的子集rj i。配置儀器ik的費用為ck美元。實驗ej的贊助商已同意為該實驗結果支...
P2762 太空飛行計畫問題
本來是想做 noi2009的植物大戰殭屍來著,建了半天模型都沒又成功。於是看了看題解,發現這個問題叫做最大權閉合圖 我tm好像沒學過啊.於是先看了看概念,做了下入門的題目,然後一做就是一晚上 慘 我真不是頹了來著。這個題引入了最大權閉合圖的概念。乙個閉合圖的定義為圖中所有點的出邊的終點都在這個圖中。...
洛谷P2762 太空飛行計畫問題(最小割)
傳送門 總而言之,就是求乙個圖,每乙個點有點權,閉合圖就是若圖中有點 u 且原圖中存在邊 u,v 那麼點 v 也在圖中。然後求乙個最大權的閉合圖即可 具體證明看上面 最大權閉合圖可以轉化成下面那樣建圖之後求最小割 源點向所有實驗連邊,容量為收益,實驗向對應儀器連邊,容量為 inf 儀器向匯點連邊,容...