您的位置:首页 > 其它

uva11082 知道矩阵每行每列数字之和 求矩阵每一个元素 最大流

2017-09-27 11:44 405 查看
#include<cstdio>
#include<cstring>
#include<queue>
#define INF 0x3f3f3f3f
using namespace std;
int n,m,a[50],b[50],cap[50][50],pre[60],flow[50];
int bfs(){
memset(pre,-1,sizeof(pre));
pre[0]=flow[0]=INF;
queue<int>q;
q.push(0);
while(!q.empty()){
int u=q.front();q.pop();
for(int i=1;i<=n+m+1;i++){
if(pre[i]==-1 && cap[u][i]){
flow[i]=min(flow[u],cap[u][i]);
pre[i]=u;
q.push(i);
}
}
}
if(pre[n+m+1]==-1) return -1;
return flow[n+m+1];
}
void maxflow(){
while(1){
int t=bfs();
if(t==-1) break;
int t1=n+m+1;
while(t1){
int t2=pre[t1];
cap[t2][t1]-=t;
cap[t1][t2]+=t;
t1=t2;
}
}
}
int main(){
int T,t=1;
scanf("%d",&T);
while(T--){
memset(cap,0,sizeof(cap));
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++) cap[0][i]=a[i]-a[i-1]-m;
for(int i=1;i<=m;i++) scanf("%d",&b[i]);
for(int i=1;i<=m;i++) cap[i+n][n+m+1]=b[i]-b[i-1]-n;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cap[i][j+n]=19;
maxflow();
printf("Matrix %d\n",t++);
for(int i=1;i<=n;i++){
for(int j=1;j<m;j++)
printf("%d ",cap[j+n][i]+1);
printf("%d\n",cap[m+n][i]+1);
}
printf("\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: