日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

POJ 3469 Dual Core CPU(最小割模型的建立)

發布時間:2025/7/14 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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(最小割模型的建立)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。