HDU5619 Jam's store(最小费用最大流 MCMF)
生活随笔
收集整理的這篇文章主要介紹了
HDU5619 Jam's store(最小费用最大流 MCMF)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題意
n個(gè)顧客m個(gè)服務(wù)員,給出每個(gè)服務(wù)員給每個(gè)顧客服務(wù)需要的時(shí)間,求顧客最小的等待時(shí)間
建圖
網(wǎng)絡(luò)流真是玄學(xué)啊,就是不會(huì)建圖。。
- 源點(diǎn)向每個(gè)客戶連邊,控制流量為n
- 服務(wù)員拆點(diǎn),每個(gè)客戶向每個(gè)服務(wù)員連n條邊,表示是該服務(wù)員倒數(shù)第k個(gè)服務(wù)的對(duì)象,代價(jià)為k*cost[i] [j]
- 拆點(diǎn)后的服務(wù)員向匯點(diǎn)連邊
因此每個(gè)服務(wù)員會(huì)先確定最后一個(gè)服務(wù)的對(duì)象
代碼
#include <bits/stdc++.h> #define mem(a,b) memset(a,b,sizeof(a)) #define rep(i,a,b) for(int i=a;i<b;i++) #define debug(a) printf("a =: %d\n",a); #define sc(x) scanf("%d",&x) const int INF=0x3f3f3f3f; const int maxn=500+50; const int Mod=1000000007; const double PI=acos(-1); typedef long long ll; typedef unsigned int ui; using namespace std;struct Edge{int from,to,cap,flow,cost;Edge() {}Edge(int from, int to, int cap, int flow, int cost) : from(from), to(to), cap(cap), flow(flow), cost(cost) {} };struct MCMF{int m;vector<Edge> edges;vector<int> G[maxn];int inq[maxn];int d[maxn];int p[maxn];int a[maxn];void init(int n){for(int i=0;i<=n;i++) G[i].clear();edges.clear();}void addEdge(int from,int to,int cap,int cost){edges.push_back(Edge(from,to,cap,0,cost));edges.push_back(Edge(to,from,0,0,-cost));m=edges.size();G[from].push_back(m-2);G[to].push_back(m-1);}bool spfa(int s,int t,int &flow,int &cost){mem(d,0x3f); mem(inq,0); mem(a,0);d[s]=0; inq[s]=1; p[s]=0; a[s]=INF;queue<int> qu;qu.push(s);while(!qu.empty()){int u=qu.front(); qu.pop();inq[u]=0;int sz=G[u].size();for(int i=0;i<sz;i++){Edge &edge=edges[G[u][i]];if(edge.cap>edge.flow && d[edge.to]>d[u]+edge.cost){d[edge.to]=d[u]+edge.cost;p[edge.to]=G[u][i];a[edge.to]=min(a[u],edge.cap-edge.flow);if(!inq[edge.to]){qu.push(edge.to);inq[edge.to]=1;}}}}if(d[t]==INF) return false;flow+=a[t];cost+=d[t]*a[t];int u=t;while(u!=s){edges[p[u]].flow+=a[t];edges[p[u]^1].flow-=a[t];u=edges[p[u]].from;}return true;}int minCost(int s,int t){int flow=0,cost=0;while(spfa(s,t,flow,cost));//cout<<"flow "<<flow<<endl;return cost;} };int s[233][233]; MCMF mcmf;int main() { #ifndef ONLINE_JUDGE//freopen("/home/martin/ClionProjects/untitled/in.txt","r",stdin);//freopen("/home/martin/ClionProjects/untitled/out.txt","w",stdout); #endifint T; scanf("%d",&T);for(int cs=1;cs<=T;cs++){int n,m;scanf("%d %d",&m,&n);//scanf("%d %d",&n,&m);for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%d",&s[i][j]);int N=1+n+n*m;mcmf.init(N+1);for(int i=1;i<=n;i++)mcmf.addEdge(0,i,1,0);for(int j=1;j<=m;j++)for(int i=1;i<=n;i++){for(int k=1;k<=n;k++){mcmf.addEdge(i,j*n+k,1,k*s[i][j]);}}for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)mcmf.addEdge(j*n+i,N,1,0);printf("%d\n",mcmf.minCost(0,N));//printf("Case #%d: %d\n",cs,mcmf.minCost(0,N));}return 0; }總結(jié)
以上是生活随笔為你收集整理的HDU5619 Jam's store(最小费用最大流 MCMF)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【重识云原生】第六章容器6.1.7.2节
- 下一篇: 【鸿蒙OS开发入门】13 - 启动流程代