1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
| #include<bits/stdc++.h> using namespace std; #define pb push_back #define mp make_pair #define fi first #define se second typedef pair<int,int> pii; typedef vector<int> vi;
const int N=33000; const int INF=0x3f3f3f3f; int n,m,s,t,cur[N],cnt,dist[N],cost,tt[50][200],p[1000]; bool st[N]; struct E { int v; int c,w; int a,b; E(){} E(int v,int c,int w,int a,int b):v(v),c(c),w(w),a(a),b(b){} }; vector<E> e; vi G[N]; vector<pii> ud; void init() { e.clear(); for(int i=1;i<=n;i++) G[i].clear(); } void addedge(int u,int v,int c,int w,int a,int b) { e.push_back(E(v,c,w,a,b)); e.push_back(E(u,0,-w,a,b)); G[u].push_back(e.size()-2); G[v].push_back(e.size()-1); } bool spfa() { for(int i=1;i<=n;i++) dist[i]=INF,st[i]=false; queue<int> q; q.push(s); dist[s]=0; while(!q.empty()) { int u=q.front(); q.pop(); st[u]=false; for(auto x:G[u]) { int &v=e[x].v,&c=e[x].c,&w=e[x].w; if(c>0&&dist[v]>dist[u]+w) { dist[v]=dist[u]+w; if(!st[v]) q.push(v),st[v]=true; } } } return dist[t]!=INF; } int dfs(int u,int a) { if(u==t) return a; int f,flow=0; st[u]=true; for(int &i=cur[u];i<G[u].size();i++) { int &v=e[G[u][i]].v,&c=e[G[u][i]].c,&w=e[G[u][i]].w; if(st[v]||c<=0||dist[v]!=dist[u]+w||(f=dfs(v,min(a,c)))<=0) continue; if(v==t) ud.push_back(mp(e[G[u][i]].a,e[G[u][i]].b)); c-=f; e[G[u][i]^1].c+=f; a-=f; flow+=f; cost+=f*w; if(a==0) break; } st[u]=false; return flow; } void dinic(int x) { n=t+cnt; while(spfa()) { for(int i=1;i<=n;i++) cur[i]=0; dfs(s,INF); for(int j=0;j<ud.size();j++) { n++; addedge(n,t,1,0,ud[j].fi,ud[j].se+1); for(int i=1;i<=x;i++) addedge(i,n,1,(ud[j].se+1)*tt[i][ud[j].fi],0,0); } ud.clear(); } printf("%d\n",cost); } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&p[i]); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&tt[i][j]); s=n+1,t=n+2; for(int i=1;i<=n;i++) addedge(s,i,p[i],0,0,0); for(int i=1;i<=m;i++) { int x=t+(++cnt); addedge(x,t,1,0,i,1); for(int j=1;j<=n;j++) addedge(j,x,1,tt[j][i],0,0); } dinic(n); return 0; }
|