UVA11082
2016-05-10 21:46
260 查看
最大流问题,然而没想到...第i行到第j列的最大流,就是(i,j)元素,太弱了我,想不到啊。
同时在算节点的cap时,1~20的范围转换成0~19,把每一行的值减去c,每一列的值减去r。
同时在算节点的cap时,1~20的范围转换成0~19,把每一行的值减去c,每一列的值减去r。
#include<iostream> #include<vector> #include<queue> #include<string.h> #include<stdio.h> using namespace std; const int INF=0x7fffffff; struct Edge { int from,to,flow,cap; Edge(int u,int v,int f,int c):from(u),to(v),flow(f),cap(c){} }; vector<Edge> edges; vector<int> num[45]; int a[45],p[45]; int r,c,sumr[21],sumc[21],vr[21],vc[21],k; int map[21][21]; void add(int from,int to,int cap) { edges.push_back(Edge(from,to,0,cap)); edges.push_back(Edge(to,from,0,0)); k+=2; num[from].push_back(k-2); num[to].push_back(k-1); } void maxflow(int s,int t) { int x,i; while(true) { memset(a,0,sizeof(a)); queue<int> q; q.push(s); a[s]=INF; while(!q.empty()) { x=q.front(),q.pop(); for(i=0;i<num[x].size();i++) { Edge &e=edges[num[x][i]]; if(!a[e.to]&&e.cap>e.flow) { a[e.to]=min(a[x],e.cap-e.flow); p[e.to]=num[x][i]; q.push(e.to); } } if(a[t]) break; } if(!a[t]) break; for(i=t;i!=s;i=edges[p[i]].from) { edges[p[i]].flow+=a[t]; edges[p[i]^1].flow-=a[t]; } } } void output() { int i,j; for(i=1;i<=r;i++) for(j=1;j<num[i].size();j++) map[i][j]=edges[num[i][j]].flow; for(i=1;i<=r;i++) { for(j=1;j<=c;j++) cout<<map[i][j]+1<<" "; cout<<endl; } cout<<endl; } int main() { int T,cnt=0,i,j; sumr[0]=sumc[0]=0; scanf("%d",&T); while(T--) { edges.clear(); for(i=0;i<45;i++) num[i].clear(); k=0; scanf("%d%d",&r,&c); for(i=1;i<=r;i++) { scanf("%d",&sumr[i]); vr[i]=sumr[i]-sumr[i-1]-c; add(0,i,vr[i]); } for(i=1;i<=c;i++) { scanf("%d",&sumc[i]); vc[i]=sumc[i]-sumc[i-1]-r; add(r+i,c+r+1,vc[i]); } for(i=1;i<=r;i++) for(j=1;j<=c;j++) { add(i,j+r,19); } maxflow(0,r+c+1); printf("Matrix %d\n",++cnt); output(); } }
相关文章推荐
- j2ee四大作用域pagecontext,request,session,ServletContext
- OtoStudio学习笔记1(视频截图)
- (五)html5设置带背景的输入框
- 开发中常遇到的Python陷阱和注意点
- class选择器与id选择器的区别
- VC设置项目属性时"从父级或项目默认设置继承"中的父级在哪里?
- Java连接数据库类
- My_Plan part1 小结
- 第一次面试
- Ubuntu 15.04 系统安装
- 网络编程知识(9)--网络应用层协议的开发
- Maven JSP 标签
- java学习小结(16.05.10)eclipse一些最基本的使用方法
- 微信开发文档
- 剑指offer之面试题8旋转数组的最小数字
- Drawable解析1——ColorDrawable、BitmapDrawable、ClipDrawabl和ScaleDrawable
- zoj2588(无向图求割边)
- vim编辑器常用命令
- AYITACM2016省赛第四周 j-最短路(Dijkstra算法)
- 2006