POJ 3469 Dual Core CPU(最小割模型的建立)
生活随笔
收集整理的這篇文章主要介紹了
POJ 3469 Dual Core CPU(最小割模型的建立)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
分析:
這類問題的一遍描述,把一些對象分成兩組,劃分有一些代價,問最小代價。一般性的思路是,
把這兩組看成是S點和T點,把劃分的代價和割邊的容量對應起來求最小割。
把S和可模版tem之間到達關系看作是屬于核A,對稱地,T對應B。模塊tem安裝在A上代價Ai,就是割斷tem和T,連一條tem到T的容量為Ai的邊。
相應地,對于Bi,連一條S到tem容量為Bi的邊。當ai安裝在A上,bi安裝在B上,也就是s - ai, bi - t(-表示可到達),這時候如果有額外花費wi
那么ai - bi之間連上容量為wi的邊,反過來bi和ai對換一下也是類似的。
輸入很大,光是I/O就能優化1s,ISAP會更快。
/********************************************************* * ------------------ * * author AbyssalFish * **********************************************************/ #include<cstdio> #include<iostream> #include<string> #include<cstring> #include<queue> #include<vector> #include<stack> #include<vector> #include<map> #include<set> #include<algorithm> #include<cmath> using namespace std;const int maxv = 2e4+2, maxe = 4e5+maxv*4; int hd[maxv],to[maxe],nx[maxe],ec,cap[maxe]; #define eachEage int i = hd[u]; ~i; i = nx[i] inline void add(int u,int v, int cp) {nx[ec] = hd[u];to[ec] = v;cap[ec] = cp;hd[u] = ec++; } inline void Add(int u,int v,int cp) {add(u,v,cp); add(v,u,0); } int lv[maxv], q[maxv]; bool vis[maxv]; int S,T; bool bfs() {memset(vis,0,sizeof(bool)*(T+1));int l = 0, r = 0;lv[q[r++] = S] = 0;vis[S] = true;while(l<r){int u = q[l++];for(eachEage){int v = to[i];if(!vis[v] && cap[i]){lv[q[r++] = v] = lv[u] + 1;vis[v] = true;}}}return vis[T]; }int cur[maxv];int aug(int u,int a) {if(u == T || !a) return a;int flow = 0,f;for(int &i = cur[u]; ~i; i = nx[i]){int v = to[i];if(lv[v] == lv[u]+1 && (f = aug(v, min(a,cap[i])))){flow += f; a -= f;cap[i] -= f; cap[i^1] += f;if(!a) break;}}return flow; }int maxFlow() {int flow = 0;while(bfs()){memcpy(cur,hd,sizeof(int)*(T+1));flow += aug(S,1<<30);}return flow; }inline int read() {int ret; char c; while(c = getchar(),c<'0'||c>'9');ret = c-'0';while(c = getchar(),c>='0'&&c<='9') ret = ret*10 + c-'0';return ret; }//#define LOCAL int main() { #ifdef LOCALfreopen("in.txt","r",stdin); #endifint n, m;while(~scanf("%d%d",&n,&m)){S = 0; T = n+1;memset(hd,0xff,sizeof(int)*(T+1)); ec = 0;for(int i = 1; i <= n; i++){Add(i,T,read());Add(S,i,read());}for(int i = 0; i < m; i++){int a = read(),b = read(),w = read();add(a,b,w); add(b,a,w);}printf("%d\n",maxFlow());}return 0; }?
轉載于:https://www.cnblogs.com/jerryRey/p/4947596.html
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的POJ 3469 Dual Core CPU(最小割模型的建立)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信号通讯
- 下一篇: SAP FICO hande汉得培训资料