2 条题解
-
0
#include <bits/stdc++.h> using namespace std; const int N=1100, M=51100; struct edge{int x,y,f,pre;}a[M];int alen,last[N],cur[N]; void ins(int x,int y,int f) { ++alen;a[alen]=edge{x,y,f,last[x]};last[x]=alen; ++alen;a[alen]=edge{y,x,0,last[y]};last[y]=alen; } int h[1100],st,ed; bool bfs() { deque<int>Q;Q.clear(); memset(h,0,sizeof(h));h[st]=1; Q.push_back(st); while(!Q.empty()) { int x=Q.front();Q.pop_front(); for(int k=last[x];k;k=a[k].pre)if(a[k].f) { int y=a[k].y; if(h[y]==0) { h[y]=h[x]+1; Q.push_back(y); } } } return h[ed]>0; } int dinic(int x,int f) { if(x==ed)return f; int sx=0; for(int k=cur[x];k;k=a[k].pre)if(a[k].f) { cur[x]=k; int y=a[k].y; if(h[y]==h[x]+1) { int sy=dinic(y,min(a[k].f,f-sx)); a[k].f-=sy;a[k^1].f+=sy; sx+=sy;if(sx==f) return f; } } if(sx==0)h[x]=0; return sx; } int n,m,p[N][25],B[25]; bool check(int mid) { st=n+m+1;ed=n+m+2; for (int L=1;L<=m-mid+1;L++) { int R=L+mid-1; alen=1;memset(last,0,sizeof(last)); for (int i=1;i<=n;i++) ins(st, i, 1); for (int i=1;i<=m;i++) ins(n+i, ed, B[i]); for (int i=1;i<=n;i++) for (int j=L;j<=R;j++) ins(i, n+p[i][j], 1); int s=0; while(bfs()) { memcpy(cur,last,sizeof(last)); s+=dinic(st,1<<30); } if(s==n)return 1; } return 0; } int main() { scanf("%d%d",&n,&m); for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) scanf("%d",&p[i][j]); for (int i=1;i<=m;i++)scanf("%d",&B[i]); int L=1,R=m,ans=-1; while(L<=R) { int mid=(L+R)/2; if (check(mid)==1)ans=mid,R=mid-1; else L=mid+1; } printf("%d\n",ans); return 0; } -
0
#include<bits/stdc++.h> using namespace std; const int N=1100,M=51100; struct edge{int x,y,f,pre;}a[M];int alen,last[N],cur[N];; void ins(int x,int y,int f) { ++alen;a[alen]=edge{x,y,f,last[x]};last[x]=alen; ++alen;a[alen]=edge{y,x,0,last[y]};last[y]=alen; } int h[1100],st,ed; bool bfs() { deque<int>Q;Q.clear(); memset(h,0,sizeof(h));h[st]=1; Q.push_back(st); while(!Q.empty()) { int x=Q.front();Q.pop_front(); for(int k=last[x];k;k=a[k].pre)if(a[k].f) { int y=a[k].y; if(h[y]==0) { h[y]=h[x]+1; Q.push_back(y); } } } return h[ed]>0; } int dinic(int x,int f) { if(x==ed)return f; int sx=0; for(int k=cur[x];k;k=a[k].pre)if(a[k].f) { cur[x]=k; int y=a[k].y; if(h[y]==h[x]+1) { int sy=dinic(y,min(a[k].f,f-sx)); a[k].f-=sy;a[k^1].f+=sy; sx+=sy;if(sx==f) return f; } } if(sx==0)h[x]=0; return sx; } int n,m,p[N][25],B[25]; bool check(int mid) { st=n+m+1;ed=n+m+2; for (int L=1;L<=m-mid+1;L++) { int R=L+mid-1; alen=1;memset(last,0,sizeof(last)); for (int i=1;i<=n;i++) ins(st , i , 1 ); for (int i=1;i<=m;i++) ins(n+i, ed , B[i]); for (int i=1;i<=n;i++) for (int j=L;j<=R;j++) ins(i,n+p[i][j],1); int s=0; while(bfs()) { memcpy(cur,last,sizeof(last)); s+=dinic(st,1<<30); } if(s==n)return 1; } return 0; } int main() { scanf("%d%d",&n,&m); for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) scanf("%d",&p[i][j]); for (int i=1;i<=m;i++)scanf("%d",&B[i]); int L=1,R=m,ans=-1; while(L<=R) { int mid=(L+R)/2; if (check(mid)==1)ans=mid,R=mid-1; else L=mid+1; } printf("%d\n",ans); return 0; }
- 1
信息
- ID
- 312
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 5
- 标签
- 递交数
- 82
- 已通过
- 31
- 上传者