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 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
|
#define ll long long #define re register #define inf 0x3f3f3f3f #define N 2000 using namespace std; struct { int dis,w,to,next; }e[1000067]; inline int read(){ int x=0,w=0;char ch=getchar(); while (!isdigit(ch))w|=ch=='-',ch=getchar(); while (isdigit(ch))x=(x<<1)+(x<<3)+ch-'0',ch=getchar(); return w?-x:x; } int cnt=1,head[N],dis[N],vis[N],inque[N],cost,n,m,s,t,a[N],b[N],c[N][N]; inline void add(int u,int v,int d,int w){ e[++cnt].to=v; e[cnt].next=head[u]; e[cnt].dis=d; e[cnt].w=w; head[u]=cnt; e[++cnt].to=u; e[cnt].next=head[v]; e[cnt].dis=0; e[cnt].w=-w; head[v]=cnt; } bool spfa1(){ memset(dis,0x3f,sizeof(dis)); queue<int>q;q.push(s); dis[s]=0; while (!q.empty()){ int u=q.front();q.pop();inque[u]=0; for (int i=head[u];i;i=e[i].next){ int v=e[i].to; if (e[i].dis&&dis[v]>dis[u]+e[i].w){ dis[v]=dis[u]+e[i].w; if (!inque[v]) q.push(v),inque[v]=1; } } } return dis[t]!=inf; } bool spfa2(){ for (int i=s;i<=t;++i)dis[i]=-inf; queue<int>q;q.push(s); dis[s]=0; while (!q.empty()){ int u=q.front();q.pop();inque[u]=0; for (int i=head[u];i;i=e[i].next){ int v=e[i].to; if (e[i].dis&&dis[v]<dis[u]+e[i].w){ dis[v]=dis[u]+e[i].w; if (!inque[v]) q.push(v),inque[v]=1; } } } return dis[t]!=-inf; } int dfs(int u,int mn){ vis[u]=1; if (u==t)return mn; int used=0,mi; for (int i=head[u];i;i=e[i].next){ int v=e[i].to; if ((!vis[v]||v==t)&&e[i].dis&&dis[v]==dis[u]+e[i].w) if (mi=dfs(v,min(e[i].dis,mn-used))){ e[i].dis-=mi; e[i^1].dis+=mi; used+=mi; cost+=mi*e[i].w; if (used==mn)break; } } return used; } void Dinic1(){ while (spfa1()){ vis[t]=1; while (vis[t]){ memset(vis,0,sizeof(vis)); dfs(s,inf); } } } void Dinic2(){ while (spfa2()){ vis[t]=1; while (vis[t]){ memset(vis,0,sizeof(vis)); dfs(s,inf); } } } signed main(){ n=read(),m=read(),s=0,t=n+m+1; for (int i=1;i<=n;++i)a[i]=read(),add(s,i,a[i],0); for (int i=1;i<=m;++i)b[i]=read(),add(i+n,t,b[i],0); for (int i=1;i<=n;++i) for (int j=1;j<=m;++j) c[i][j]=read(),add(i,j+n,inf,c[i][j]); Dinic1(); printf("%dn",cost); memset(head,0,sizeof(head));cnt=1;cost=0; for (int i=1;i<=n;++i)add(s,i,a[i],0); for (int i=1;i<=m;++i)add(i+n,t,b[i],0); for (int i=1;i<=n;++i) for (int j=1;j<=m;++j) add(i,j+n,inf,c[i][j]); Dinic2(); printf("%dn",cost); return 0; }
|
近期评论