2 条题解
-
0
#include<bits/stdc++.h> using namespace std; const int N=250, MM=1e6; struct edge{int x,y,f,pre;}a[MM];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[250],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>0;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=last[x];k;k=a[k].pre)if(a[k].f) { 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,K,C,M,Map[250][250]; bool check(int mid) { alen=1;memset(last,0,sizeof(last)); for(int i=K+1;i<=K+C;i++) for(int j=1;j<=K;j++) if(Map[i][j]<=mid)ins(i,j,1); for(int i=1;i<=K;i++)ins(i,ed,M); for(int i=K+1;i<=K+C;i++)ins(st,i,1); int s=0; while(bfs()==1) { memcpy(cur,last,sizeof(last)); s+=dinic(st,C); } return s==C; } int main() { scanf("%d%d%d",&K,&C,&M);n=K+C; st=n+1;ed=n+2; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { scanf("%d",&Map[i][j]); if(Map[i][j]==0)Map[i][j]=50000; } for(int k=1;k<=n;k++) for(int i=1;i<=n;i++)if(i!=k) for(int j=1;j<=n;j++)if(j!=k&&j!=i) Map[i][j]=min(Map[i][j],Map[i][k]+Map[k][j]); int L=0,R=50000,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=250,MM=1e6; struct edge{int x,y,f,pre;}a[MM];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[250],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>0;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=last[x];k;k=a[k].pre)if(a[k].f) { 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,K,C,M,Map[250][250]; bool check(int mid) { alen=1;memset(last,0,sizeof(last)); for(int i=K+1;i<=K+C;i++) for(int j=1;j<=K;j++) if(Map[i][j]<=mid)ins(i,j,1); for(int i=1;i<=K;i++)ins(i,ed,M); for(int i=K+1;i<=K+C;i++)ins(st,i,1); int s=0; while(bfs()==1) { memcpy(cur,last,sizeof(last)); s+=dinic(st,C); } return s==C; } int main() { scanf("%d%d%d",&K,&C,&M);n=K+C; st=n+1;ed=n+2; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) { scanf("%d",&Map[i][j]); if(Map[i][j]==0)Map[i][j]=50000; } for(int k=1;k<=n;k++) for(int i=1;i<=n;i++)if(i!=k) for(int j=1;j<=n;j++)if(j!=k&&j!=i) Map[i][j]=min(Map[i][j],Map[i][k]+Map[k][j]); int L=0,R=50000,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
- 311
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 4
- 标签
- 递交数
- 78
- 已通过
- 34
- 上传者