博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj 2396 budget
阅读量:4129 次
发布时间:2019-05-25

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

原题:

题目大意:

现在有一个M*N的矩阵。已知M行每行的和a[1]..a[m],N列每列的和b[1]..b[n],以及一些限制条件:
第i行j列必须是k;第i行j列必须大于(小于)k。
试给出一种方案。

 建好图,就是一个上下界流!详情 讯代码

#include
#include
#define ROW 205#define COL 25#define MAXE 100005#define MAXN 1250#define INF 0x7fffffffint row[ROW],col[COL];int map[ROW][COL][2];struct Edge{ int flow; int node; int next;}edge[MAXE];struct Contain{ int a,b,c; char ch;}con[1005];int cnt,head[MAXN],dep[300],ps[MAXN],ans[ROW][COL];void add( int a, int b, int flow ){ edge[cnt].flow=flow,edge[cnt].node=b,edge[cnt].next=head[a];head[a]=cnt++; edge[cnt].flow=0,edge[cnt].node=a,edge[cnt].next=head[b];head[b]=cnt++;}int fun(int x, int y, int low, int high){ map[x][y][0] = (map[x][y][0]>low)?map[x][y][0]:low; map[x][y][1] = (map[x][y][1]
< col[j])?row[i]:col[j]; } scanf("%d",&N); for( i = 1; i <= N; i++ ) scanf("%d %d %c %d",&con[i].a,&con[i].b,&con[i].ch,&con[i].c); mark=1; for( mark = i = 1; (i <= N)&&mark; i++ ) { a = con[i].a; b = con[i].b; if(a&&b) { if(con[i].ch == '=') { if(!fun( a, b, con[i].c, con[i].c )) { mark = 0; continue; } } else if(con[i].ch == '>') { if(!fun( a, b, con[i].c + 1, INF )) { mark = 0; continue; } } else { if(!fun( a, b, 0, con[i].c - 1 )) { mark = 0; continue; } } } else if(a||b) { if(a){ for(j = 1; (j <= m)&&mark; j++) { b=j; if(con[i].ch == '=') { if(!fun( a, b, con[i].c, con[i].c )) { mark = 0; continue; } } else if(con[i].ch == '>') { if(!fun( a, b, con[i].c + 1, INF )) { mark = 0; continue; } } else { if(!fun( a, b, 0, con[i].c - 1 )) { mark = 0; continue; } } } } else { for(j = 1; (j <= n)&&mark; j++) { a=j; if(con[i].ch == '=') { if(!fun( a, b, con[i].c, con[i].c )) { mark = 0; continue; } } else if(con[i].ch == '>') { if(!fun( a, b, con[i].c + 1, INF )) { mark = 0; continue; } } else { if(!fun( a, b, 0, con[i].c - 1 )) { mark = 0; continue; } } } } } else { for(j = 1; (j <= n)&&mark; j++) for(k = 1; (k <= m)&&mark; k++) { a=j,b=k; if(con[i].ch == '=') { if(!fun( a, b, con[i].c, con[i].c )) { mark = 0; continue; } } else if(con[i].ch == '>') { if(!fun( a, b, con[i].c + 1, INF )) { mark = 0; continue; } } else { if(!fun( a, b, 0, con[i].c - 1 )) { mark = 0; continue; } } } } } if( mark && (sum1 == sum2) ) { memset(head,-1,sizeof(head)); cnt = 0; sum = 0; s = n + m + 2, t = n + m + 3; for(j = 1; j <= n; j++) { add( 0, j, 0); add( 0, t, row[j] ); add( s, j, row[j] ); sum += row[j]; } sum1 = s - 1; for(j = 1; j <= m; j++) { add( j+n, sum1, 0); add( j+n, t, col[j] ); add( s, sum1, col[j] ); sum += col[j]; } for(j = 1; j <= n; j++) { for(k = 1; k <= m; k++) { add( j, n+k, map[j][k][1]-map[j][k][0] ); add( j, t, map[j][k][0] ); add( s, n+k, map[j][k][0] ); sum+=map[j][k][0]; } } add( s-1, 0, INF ); if(sum==flow(s,t)) { a=n+1,b=n+k; for(j = 1; j <= n; j++) { for(k = head[j]; ~k ; k = edge[k].next) { if((edge[k].node>=a)&&(edge[k].node<=b)) ans[j][edge[k].node-n]=map[j][edge[k].node-n][0]+edge[k^1].flow; } } for(j = 1; j <= n; j++) { for(k = 1; k <= m; k++) printf("%d ",ans[j][k]); printf("\n"); } printf("\n"); } else printf("IMPOSSIBLE\n\n"); } else printf("IMPOSSIBLE\n\n"); } return 0;}

转载地址:http://nhuvi.baihongyu.com/

你可能感兴趣的文章
Valid Palindrome 简单的回文判断
查看>>
对话周鸿袆:从程序员创业谈起
查看>>
web.py 0.3 新手指南 - 如何用Gmail发送邮件
查看>>
web.py 0.3 新手指南 - RESTful doctesting using app.request
查看>>
web.py 0.3 新手指南 - 使用db.query进行高级数据库查询
查看>>
web.py 0.3 新手指南 - 多数据库使用
查看>>
一步步开发 Spring MVC 应用
查看>>
python: extend (扩展) 与 append (追加) 的差别
查看>>
「译」在 python 中,如果 x 是 list,为什么 x += "ha" 可以运行,而 x = x + "ha" 却抛出异常呢?...
查看>>
浅谈JavaScript的语言特性
查看>>
LeetCode第39题思悟——组合总和(combination-sum)
查看>>
LeetCode第43题思悟——字符串相乘(multiply-strings)
查看>>
LeetCode第44题思悟——通配符匹配(wildcard-matching)
查看>>
LeetCode第45题思悟——跳跃游戏(jump-game-ii)
查看>>
LeetCode第46题思悟——全排列(permutations)
查看>>
LeetCode第47题思悟—— 全排列 II(permutations-ii)
查看>>
LeetCode第48题思悟——旋转图像(rotate-image)
查看>>
驱动力3.0,动力全开~
查看>>
记CSDN访问量10万+
查看>>
Linux下Oracle数据库账户被锁:the account is locked问题的解决
查看>>