博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[网络流最大流经典][uva 11082][矩阵解压]
阅读量:6249 次
发布时间:2019-06-22

本文共 2179 字,大约阅读时间需要 7 分钟。

题目大意

这里写图片描述

分析

这里写图片描述

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#define oo 0x13131313using namespace std;const int MAXN=200+5;const int MAXM=2000;const int INF=0x3f3f3f3f;struct Edge{ int to,next,cap,flow; void get(int a,int b,int c,int d) { to=a;next=b;cap=c;flow=d; }}edge[MAXM];int tol;int head[MAXN];int gap[MAXN],dep[MAXN],pre[MAXN],cur[MAXN];void init(){ tol=0; memset(head,-1,sizeof(head));}//单向图三个参数,无向图四个参数void addedge(int u,int v,int w,int rw=0){ edge[tol].get(v,head[u],w,0);head[u]=tol++; edge[tol].get(u,head[v],rw,0);head[v]=tol++;}int sap(int start,int end,int N){ memset(gap,0,sizeof(gap)); memset(dep,0,sizeof(dep)); memcpy(cur,head,sizeof(head)); int u=start; pre[u]=-1; gap[0]=N; int ans=0; while(dep[start]
edge[i].cap-edge[i].flow) Min=edge[i].cap-edge[i].flow; for(int i=pre[u];i!=-1;i=pre[edge[i^1].to]) { edge[i].flow+=Min; edge[i^1].flow-=Min; } u = start; ans+=Min; continue; } bool flag=false; int v; for(int i=cur[u];i !=-1;i=edge[i].next) { v=edge[i].to; if(edge[i].cap-edge[i].flow&&dep[v]+1==dep[u]) { flag=true; cur[u]=pre[v]=i; break; } } if(flag) { u=v; continue; } int Min=N; for(int i=head[u];i!=-1;i=edge[i].next) if(edge[i].cap-edge[i].flow&&dep[edge[i].to]
>R>>C; for(int i=1;i<=R;i++) scanf("%d",&A[i]); for(int i=1;i<=C;i++) scanf("%d",&B[i]); for(int i=R;i>=1;i--) { A[i]=A[i]-A[i-1]; sum=sum+A[i]; } for(int i=C;i>=1;i--) B[i]=B[i]-B[i-1];}void solve(){ int S=0,T=R+C+1; //S-> for(int i=1;i<=R;i++) { addedge(S,i,A[i]-C); } //->T for(int i=1;i<=C;i++) { addedge(R+i,T,B[i]-R); } for(int i=1;i<=R;i++) for(int j=1;j<=C;j++) { addedge(i,R+j,19); }}int main(){// freopen("a.in","r",stdin); int T; cin>>T; int CASE=0; while(T--) { printf("Matrix %d\n",++CASE); input(); solve(); int k=sap(0,R+C+1,R+C+2); for(int i=1;i<=R;i++) { for(int p=head[i];p!=-1;p=edge[p].next) { ANS[i][edge[p].to-R]=edge[p].flow+1; } } for(int i=1;i<=R;i++) { for(int j=1;j<=C;j++) { printf("%d",ANS[i][j]); if(j!=C) printf(" "); } printf("\n"); } printf("\n"); }}

转载于:https://www.cnblogs.com/zy691357966/p/5480305.html

你可能感兴趣的文章
C# MemoryCache GCHandle
查看>>
IDEA使用及优化
查看>>
复制文件到U盘错误0x80071AC3,请运行chkdsk并重试
查看>>
MySQL_插入更新 ON DUPLICATE KEY UPDATE
查看>>
curl
查看>>
查看本机密钥 以及服务器授权密钥 免密码登录
查看>>
Docker中如何删除image(镜像)
查看>>
泛型初始化
查看>>
pandas.read_csv参数详解
查看>>
oracle软件安装完毕之后,如何创建数据库
查看>>
『MXNet』第三弹_Gluon模型参数
查看>>
ASP.NET MVC 学习笔记-7.自定义配置信息 ASP.NET MVC 学习笔记-6.异步控制器 ASP.NET MVC 学习笔记-5.Controller与View的数据传递 ASP...
查看>>
Configuring Apache Kafka for Performance and Resource Management
查看>>
excel 截取单元格部分内容(从指定位置截取)
查看>>
Email-ext plugin
查看>>
绝对干货,教你4分钟插入1000万条数据到mysql数据库表,快快进来
查看>>
文件系统
查看>>
Android模拟器Genymotion安装apk
查看>>
chrome使用技巧(看了定不让你失望)
查看>>
数据字典
查看>>