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"); } }
相关文章推荐
- UVA 11082 Matrix Decompressing 矩阵解压(最大流,经典)
- UVA11082 矩阵展开,最大流
- 最大流(矩阵解压 uva 11082)
- UVA - 108 Maximum Sum(子矩阵最大和)
- 求矩阵中元素和最大的二维子矩阵
- [网络流最大流经典][uva 11082][矩阵解压]
- 求一个矩阵中最大的二维矩阵(元素和最大)
- c编程:求出4×4矩阵中最大和最小元素值及其所在行下标和列下标,求出两条主对角线元素之和。
- uva1330 在一个大的矩阵中寻找面积最大的子矩阵
- 一、lintcode刷题记录--矩阵面积、二叉树的最大节点、整数排序、删除链表中的元素
- UVa 11082 Matrix Decompressing 最大流
- 每日一道算法题:求一个矩阵中最大的二维矩阵(元素和最大)
- 【网络流#5】UVA 11082 最大流
- UVA 11082 (最大流)
- 剑指offer面试题:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字
- 求一个矩阵中最大的二维子矩阵(元素和最大)
- UVA - 11082 Matrix Decompressing(最大流+行列模型)
- java-51-输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。
- 例题1.22 最大子矩阵 City Game UVALive - 3029 扫描法
- 将一个5*5的矩阵中最大的元素放在中心,四个角分别放四个最小的元素(顺序从左到右,从上到下顺序依次从小到大存放),写一个函数实现之。用main函数调用。