還是利用最小割的性質,這種題目叫做最大權閉合子圖。
建模方法是這樣
直接跑最小割,用獎金減去最小割就是答案。方案就是最後一遍bfs能遍歷的點
考慮最小割的意義,就是把邊刪掉使得\(s,t\)不連通。
同樣地,由於我們無法改變儀器和任務依賴的關係,只能改變乙個點是否選擇這個狀態,所以我們讓實驗和儀器的連邊為\(inf\)表示我們無法更改這個關係。
我們考慮鴿掉的獎金邊是什麼意思:這條獎金邊是一次流的限制關係,是劣勢的一方
考慮割掉的儀器邊是什麼意思:這條儀器邊太小了,以至於實驗賺的流隨便流滿了。
考慮總獎金減去最小割代價是什麼,就是
\[\sum \text-\sum \text-\sum \text
\]實際上,我們可以考慮每一條流的流經路線,也能獲得同樣的理解。
其他題我能夠獨立完成,這道題不得不看題解...實在是我思維強度不夠
//@winlere
#include#include#include#include#includeusing namespace std; typedef long long ll;
int qaq,n;
inline int qr()
inline int sp()
const int maxn=1e2+5;
struct e
e(const int&a,const int&b,const int&c)
}e[maxn<<4];
int head[maxn];
int cnt=1;
const int inf=0x3f3f3f3f;
int s,t,m;
inline void add(const int&fr,const int&to,const int&w,const int&f)
int sum=0;
queue < int > q;
int d[maxn],cur[maxn];
inline bool bfs()}}
return d[t];
}int dfs(const int&now,int fl)
}return ret;
}inline int dinic()
int main()
}for(register int t=1;t<=m;++t) add(t+n+1,t,qr(),1);
int ans=sum-dinic();
for(register int t=head[s];t;t=e[t].nx)
if(d[e[t].to]) printf("%d ",e[t].to-1);
putchar('\n');
for(register int t=head[t];t;t=e[t].nx)
if(d[e[t].to]) printf("%d ",e[t].to-n-1);
printf("\n%d\n",ans);
return 0;
}
太空飛行計畫問題
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...