2 条题解
-
0
#include<bits/stdc++.h> using namespace std; #define int long long const int N=1e6+10,inf=1e18; int n,m,st,ed,mn; struct node{int to,w,c,nxt;}e[N]; int head[N],cur[N],len; void add(int x,int y,int w,int c) { e[++len]={y,w,c,head[x]};head[x]=len; e[++len]={x,0,-c,head[y]};head[y]=len; } int d[N]; bool vis[N],inq[N]; bool spfa() { for(int i=1;i<=ed;i++)d[i]=inf; queue<int>q; q.push(st); d[st]=0; while(!q.empty()) { int x=q.front();q.pop(); inq[x]=0; for(int i=head[x];i;i=e[i].nxt) { int y=e[i].to; if(e[i].w&&d[y]>d[x]+e[i].c) { d[y]=d[x]+e[i].c; if(!inq[y])q.push(y),inq[y]=1; } } } return d[ed]!=inf; } int dfs(int x,int res) { if(x==ed||!res)return res; vis[x]=1; int ans=0; for(int i=cur[x];i;i=e[i].nxt) { int y=e[i].to; cur[x]=i; if(!vis[y]&&e[i].w&&d[y]==d[x]+e[i].c) { int sum=dfs(y,min(res-ans,e[i].w)); e[i].w-=sum; e[i^1].w+=sum; mn+=sum*e[i].c; ans+=sum; if(ans==res)break; } } vis[x]=0; return ans; } int dinic() { int ans=0,flow; while(spfa()) { memcpy(cur,head,sizeof(cur)); while((flow=dfs(st,inf)))ans+=flow; } return ans; } int a[N],b[N],c[110][110]; signed main() { cin>>n>>m,st=0,ed=n+m+1;len=1; for(int i=1;i<=n;i++)cin>>a[i]; for(int i=1;i<=m;i++)cin>>b[i]; for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>c[i][j]; for(int i=1;i<=n;i++)add(st,i,a[i],0); for(int i=1;i<=m;i++)add(i+n,ed,b[i],0); for(int i=1;i<=n;i++)for(int j=1;j<=m;j++) add(i,j+n,1e18,c[i][j]); dinic(); cout<<mn<<'\n'; mn=0;len=1;memset(head,0,sizeof(head)); for(int i=1;i<=n;i++)add(st,i,a[i],0); for(int i=1;i<=m;i++)add(i+n,ed,b[i],0); for(int i=1;i<=n;i++)for(int j=1;j<=m;j++) add(i,j+n,1e18,-c[i][j]); dinic(); cout<<-mn<<'\n'; return 0; } -
0
#include<cstdio> #include<cstring> using namespace std; typedef long long ll; ll n,m; struct node { ll next,other,c,d,y; }a[210000];ll last[510],len,st,ed,nn; ll rd[310],cd[310],f[310][310],cost; void ins(ll x,ll y,ll c,ll d) { len++; a[len].y=y;a[len].c=c;a[len].d=d; a[len].next=last[x];last[x]=len; len++; a[len].y=x;a[len].c=0;a[len].d=-d; a[len].next=last[y];last[y]=len; a[len].other=len-1; a[len-1].other=len; } ll list[1010],head,tail,d[1010]; bool v[1010]; bool spfa() { memset(d,20,sizeof(d));d[ed]=0; head=1;tail=2;list[head]=ed; ll inf=d[ed+1]; while(head!=tail) { ll x=list[head]; for(ll k=last[x];k;k=a[k].next) { ll y=a[k].y,kl=a[k].other; if(a[kl].c>0 && d[x]-a[k].d<d[y]) { d[y]=d[x]-a[k].d; if(v[y]==true) { v[y]=false; if(d[list[head+1]]>d[y]) { ll all=head; head--;if(head==0)head=nn; list[head]=list[all];list[all]=y; } else { list[tail++]=y;if(tail==nn+1)tail=1; } } } } head++;if(head==nn+1)head=1; v[x]=true; } return d[st]!=inf; } inline ll mymin(ll x,ll y){return x<y?x:y;} ll find(ll x,ll f) { v[x]=false; if(x==ed){v[x]=true;return f;} ll ans=0,t=0; for(ll k=last[x];k;k=a[k].next) { ll y=a[k].y; if(a[k].c>0 && d[y]==d[x]-a[k].d && ans<f && v[y]==true) { ans+=t=find(y,mymin(a[k].c,f-ans)); a[k].c-=t;a[a[k].other].c+=t;cost+=t*a[k].d; } } v[x]=true; return ans; } int main() { scanf("%lld%lld",&n,&m);st=0;ed=n+m+1;nn=n+m+2; for(ll i=1;i<=n;i++) { scanf("%lld",&rd[i]); ins(st,i,rd[i],0); } for(ll i=1;i<=m;i++) { scanf("%lld",&cd[i]); ins(n+i,ed,cd[i],0); } for(ll i=1;i<=n;i++) { for(ll j=1;j<=m;j++) { scanf("%lld",&f[i][j]); ins(i,j+n,999999999,f[i][j]); } } memset(v,true,sizeof(v)); ll ans=0; while(spfa())ans+=find(st,999999999); printf("%lld\n",cost); cost=0;ans=0;memset(last,0,sizeof(last)); len=0; for(ll i=1;i<=n;i++)ins(st,i,rd[i],0); for(ll i=1;i<=m;i++)ins(n+i,ed,cd[i],0); for(ll i=1;i<=n;i++) { for(ll j=1;j<=m;j++)ins(i,j+n,999999999,-f[i][j]); } while(spfa())ans+=find(st,999999999); printf("%lld\n",-cost); return 0; }
- 1
信息
- ID
- 961
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 4
- 已通过
- 4
- 上传者