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

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

hdu 4322 最大费用流

發(fā)布時(shí)間:2023/12/10 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu 4322 最大费用流 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=4322

#include <cstdio> #include <cstring> #include <iostream> #include <cmath> #include <algorithm> #include <queue> #include <vector> using namespace std;const int maxe = 50000; const int maxn = 30; const int INF = 0x3f3f3f;struct Edge{int u,v,flow,cap,cost;int next;Edge(int u=0,int v=0,int flow=0,int cap=0,int cost=0,int next=0):u(u), v(v), flow(flow), cap(cap), cost(cost), next(next) {} };struct MCMF{int d[maxn];bool inq[maxn];Edge edges[maxe];int head[maxn],cnt;int pa[maxn]; //用于回溯找增廣路。int res[maxn];void init(){memset(head,-1,sizeof(head));cnt = 0;}void addedge(int u,int v,int cap,int cost){edges[cnt] = Edge(u,v,0,cap,cost,head[u]);head[u] = cnt++;edges[cnt] = Edge(v,u,0,0,-cost,head[v]);head[v] = cnt++;}bool SPFA(int s,int t,int& flow,int& cost){memset(inq,0,sizeof(inq));memset(d,-0x3f,sizeof(d)); //這個(gè)才是WA無(wú)數(shù)次的原因,看別人的代碼才知道。queue<int> Q;Q.push(s);d[s] = 0; inq[s] = true;res[s] = INF; res[t] = 0;while(!Q.empty()){int u = Q.front(); Q.pop();inq[u] = false;for(int i=head[u];i!=-1;i=edges[i].next){Edge& e = edges[i];if(e.cap > e.flow && d[e.v] < d[u] + e.cost){d[e.v] = d[u] + e.cost;pa[e.v] = i;res[e.v] = min(res[u],e.cap-e.flow);if(!inq[e.v]){Q.push(e.v); inq[e.v] = true;}}}}if(res[t] == 0) return false;flow += res[t];cost += res[t]*d[t];for(int i=t;i!=s;i=edges[pa[i]].u){edges[pa[i]].flow += res[t];edges[pa[i]^1].flow -= res[t];}return true;}bool MaxCost(int s,int t,int N,int sumB){int flow = 0,cost = 0;while(SPFA(s,t,flow,cost)) {}return N - flow >= sumB - cost;} }solver;int main() {//freopen("E:\\acm\\input.txt","r",stdin);int T;cin>>T;for(int cas=1;cas<=T;cas++){solver.init();int N,M,K;cin>>N>>M>>K;int B[maxn];int sumB = 0;for(int i=1;i<=M;i++) { cin>>B[i]; sumB += B[i]; }int s = 0, t = N+M+1;for(int i=1;i<=N;i++) solver.addedge(s,i,1,0);int like[maxn][maxn];for(int i=1; i<=M; i++)for(int j=1; j<=N; j++){scanf("%d",&like[i][j]);if(like[i][j])solver.addedge(j,i+N,1,0);}/**for(int i=1;i<=M;i++)for(int j=1;j<=N;j++){int flag;scanf("%d",&flag);if(flag) solver.addedge(j,i+N,1,0);}這個(gè)代碼與上面的那段功能相同,但我不知道為啥會(huì)錯(cuò)。我懷疑是oj的問(wèn)題。 **/for(int i=1;i<=M;i++){solver.addedge(N+i,t,B[i]/K,K);if(B[i]%K > 1)solver.addedge(N+i,t,1,B[i]%K);}if(solver.MaxCost(s,t,N,sumB)) printf("Case #%d: YES\n",cas);else printf("Case #%d: NO\n",cas);} } View Code

?

轉(zhuǎn)載于:https://www.cnblogs.com/acmdeweilai/p/3273288.html

總結(jié)

以上是生活随笔為你收集整理的hdu 4322 最大费用流的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。