POJ PKU 2396 上下界最大流
(2010-08-26 21:36:49)
标签:
pojpku2396上下界最大流杂谈 |
分类: 网络流 |
题目描述:
一个n*m的矩阵
告诉你每一行元素的和。n个
每一列元素的和。m个
然后有t个条件:
每一个条件
a b c d 四个参数。
表示 元素 a b 和数字 d 满足条件 c;
例如:
2 1 = 3
2行1列的元素等于3
2 3 < 52行3列的元素小于5
0 2 > 2
(0表示所有)
表示所有行(1到n)的2列元素都要大于2.
问你:能不能找到满足所有条件的n*m的矩阵。
如果能的话,任意输出一个(题目是SPJ)
解题报告:
上下界的最大流就是每条边的流量有一个不能超过的上界(我们平时说的容量),还有一个不能低于的下界。
在这种情况下求出一个最大流。
1到n行:每行是一个节点
1到m列:每列是一个节点
源点s和每一个行节点连接,上界是行数字的和。下界0
每一个列节点和汇点t连接,上界是列数字的和,下界0
如果i行j列的数字大于x
那么i行节点连接j列节点,上界无穷,下界为x+1
如果i行j列的数字小于x
那么i行节点连接j列节点,上界为x - 1,下界为0
等于的话,上下界都是x。
这样建图,i行与j列的流量就是i,j的值,很好理解。
如果最大流等于所有行元素的和,就存在解,输出流量即可。
代码如下:
#include<iostream>
using namespace std;
#define Max 0x7fffffff
#define MAXN 300
#define inf 1000000000
void maxflow(int n, int src, int sink, int up[][MAXN], int
flow[][MAXN])
{
}
int limitflow(int n, int src, int sink, int up[][MAXN], int
low[][MAXN], int flow[][MAXN])
{