2 条题解
-
0
#include <bits/stdc++.h> using namespace std; const int N=5100,M=2e5+10; struct edge{int x,y,f,c,pre;}a[M];int alen,last[N],cur[N]; void ins(int x,int y,int f,int c) { a[++alen]={x,y,f,c,last[x]};last[x]=alen; a[++alen]={y,x,0,-c,last[y]};last[y]=alen; } int n,st,ed,d[N];bool v[N]; bool spfa() { queue<int> q; memset(d,0x8f,sizeof(d));d[st]=0; memset(v,0,sizeof(v)); q.push(st);v[st]=1; while(!q.empty()) { int x=q.front();q.pop();v[x]=0; for(int k=last[x];k;k=a[k].pre)if(a[k].f) { int y=a[k].y; if(d[y]<d[x]+a[k].c) { d[y]=d[x]+a[k].c; if(!v[y])q.push(y),v[y]=1; } } } return d[ed]!=d[0]; } int ans; int dinic(int x,int f) { if(x==ed) return ans+=d[ed]*f,f; int sx=0; v[x]=1; for(int k=cur[x];k;k=a[k].pre)if(a[k].f) { cur[x]=k; int y=a[k].y;if(v[y])continue; if(d[y]==a[k].c+d[x]) { int sy=dinic(y,min(f-sx,a[k].f)); a[k].f-=sy,a[k^1].f+=sy; sx+=sy;if(sx==f) return f; } } if(sx>0)v[x]=0; return sx; } int id(int i,int j,int k){return (i-1)*n+j+k*n*n;} int main() { int k;scanf("%d%d",&n,&k); alen=1;memset(last,0,sizeof(last)); for(int i=1;i<=n;i++)for(int j=1;j<=n;j++) { int c;scanf("%d",&c); ins(id(i,j,0),id(i,j,1),1,c); ins(id(i,j,0),id(i,j,1),k-1,0); if(j<n) ins(id(i,j,1),id(i,j+1,0),k,0); if(i<n) ins(id(i,j,1),id(i+1,j,0),k,0); } st=1,ed=2*n*n; ans=0; while(spfa()) { memcpy(cur,last,sizeof(cur)); int t=dinic(st,1<<30); } printf("%d\n",ans); return 0; } -
0
#include<bits/stdc++.h> using namespace std; const int N=5100,M=2e5+10; struct edge{int x,y,f,c,pre;}a[M];int alen,last[N],cur[N]; void ins(int x,int y,int f,int c) { a[++alen]={x,y,f,c,last[x]};last[x]=alen; a[++alen]={y,x,0,-c,last[y]};last[y]=alen; } int n,st,ed,d[N];bool v[N]; bool spfa() { queue<int> q; memset(d,0x8f,sizeof(d));d[st]=0; memset(v,0,sizeof(v)); q.push(st);v[st]=1; while(!q.empty()) { int x=q.front();q.pop();v[x]=0; for(int k=last[x];k;k=a[k].pre)if(a[k].f) { int y=a[k].y; if(d[y]<d[x]+a[k].c) { d[y]=d[x]+a[k].c; if(!v[y])q.push(y),v[y]=1; } } } return d[ed]!=d[0]; } int ans; int dinic(int x,int f) { if(x==ed) return ans+=d[ed]*f,f; int sx=0; v[x]=1; for(int k=cur[x];k;k=a[k].pre)if(a[k].f) { cur[x]=k; int y=a[k].y;if(v[y])continue; if(d[y]==a[k].c+d[x]) { int sy=dinic(y,min(f-sx,a[k].f)); a[k].f-=sy,a[k^1].f+=sy; sx+=sy;if(sx==f) return f; } } if(sx>0)v[x]=0; return sx; } int id(int i,int j,int k){return (i-1)*n+j+k*n*n;} int main() { int k;scanf("%d%d",&n,&k); alen=1;memset(last,0,sizeof(last)); for(int i=1;i<=n;i++)for(int j=1;j<=n;j++) { int c;scanf("%d",&c); ins( id(i,j,0), id(i,j,1),1,c); ins( id(i,j,0), id(i,j,1), k-1, 0); if(j<n) ins( id(i,j,1), id(i,j+1,0), k,0); if(i<n) ins( id(i,j,1), id(i+1,j,0), k,0); } st=1,ed=2*n*n; ans=0; while(spfa()) { memcpy(cur,last,sizeof(cur)); int t=dinic(st,1<<30); } printf("%d\n",ans); return 0; }
- 1
信息
- ID
- 1471
- 时间
- 1000ms
- 内存
- 64MiB
- 难度
- 5
- 标签
- 递交数
- 55
- 已通过
- 23
- 上传者