UVa11082 Matrix Decompressing(最小费用最大流)

题目大概有一个n*m的矩阵,已知各行所有数的和的前缀和和各列所有数的和的前缀和,且矩阵各个数都在1到20的范围内,求该矩阵的一个可能的情况。

POJ2396的弱化版本吧。。建图的关键在于:

  • 把行、列看成点,各单元看成边

这个建图感觉非常巧。。

各个单元有下界限制。。这个我可不想再写带下界的最大流。。

想了下,发现可以用最小费用最大流求解:通过放大边的费用,使得这条边成为一条必须会被经过的边。

简单来说就是各单元代表的边拆成两条,一条容量1费用-1,另外一条容量19费用0。这样跑MCMF,显然为了让费用最小,所有费用-1的边必然会经过,这样就保证了各个单元的值至少为1。

(其实有个更简单的方法就是所有单元格都同时减去1。。)

  1 #include<cstdio>
  2 #include<cstring>
  3 #include<queue>
  4 #include<algorithm>
  5 using namespace std;
  6 #define MAXN 44
  7 #define MAXM 88*88
  8 #define INF (1<<30)
  9
 10 struct Edge{
 11     int v,cap,cost,next;
 12 }edge[MAXM];
 13 int vs,vt,NV,NE,head[MAXN];
 14 void addEdge(int u,int v,int cap,int cost){
 15     edge[NE].v=v; edge[NE].cap=cap; edge[NE].cost=cost;
 16     edge[NE].next=head[u]; head[u]=NE++;
 17     edge[NE].v=u; edge[NE].cap=0; edge[NE].cost=-cost;
 18     edge[NE].next=head[v]; head[v]=NE++;
 19 }
 20
 21 int d[MAXN],pre[MAXN];
 22 bool inque[MAXN];
 23 bool SPFA(){
 24     for(int i=0; i<NV; ++i){
 25         d[i]=INF; inque[i]=0;
 26     }
 27     d[vs]=0; inque[vs]=1;
 28     queue<int> que;
 29     que.push(vs);
 30     while(!que.empty()){
 31         int u=que.front(); que.pop();
 32         for(int i=head[u]; i!=-1; i=edge[i].next){
 33             int v=edge[i].v;
 34             if(edge[i].cap && d[v]>d[u]+edge[i].cost){
 35                 d[v]=d[u]+edge[i].cost;
 36                 pre[v]=i;
 37                 if(!inque[v]){
 38                     inque[v]=1;
 39                     que.push(v);
 40                 }
 41             }
 42         }
 43         inque[u]=0;
 44     }
 45     return d[vt]!=INF;
 46 }
 47 int mxflow;
 48 int MCMF(){
 49     mxflow=0;
 50     int res=0;
 51     while(SPFA()){
 52         int flow=INF,cost=0;
 53         for(int u=vt; u!=vs; u=edge[pre[u]^1].v){
 54             flow=min(flow,edge[pre[u]].cap);
 55         }
 56         mxflow+=flow;
 57         for(int u=vt; u!=vs; u=edge[pre[u]^1].v){
 58             edge[pre[u]].cap-=flow;
 59             edge[pre[u]^1].cap+=flow;
 60             cost+=edge[pre[u]].cost;
 61         }
 62         res+=cost*flow;
 63     }
 64     return res;
 65 }
 66
 67 int row[22],col[22],ans[22][22];
 68 int main(){
 69     int t,n,m;
 70     scanf("%d",&t);
 71     for(int cse=1; cse<=t; ++cse){
 72         scanf("%d%d",&n,&m);
 73         vs=0; vt=n+m+1; NV=vt+1; NE=0;
 74         memset(head,-1,sizeof(head));
 75         for(int i=1; i<=n; ++i){
 76             scanf("%d",row+i);
 77             addEdge(vs,i,row[i]-row[i-1],0);
 78         }
 79         for(int i=1; i<=m; ++i){
 80             scanf("%d",col+i);
 81             addEdge(i+n,vt,col[i]-col[i-1],0);
 82         }
 83         for(int i=1; i<=n; ++i){
 84             for(int j=1; j<=m; ++j){
 85                 addEdge(i,j+n,1,-1);
 86                 addEdge(i,j+n,19,0);
 87             }
 88         }
 89         MCMF();
 90         memset(ans,0,sizeof(ans));
 91         for(int u=1; u<=n; ++u){
 92             for(int i=head[u]; i!=-1; i=edge[i].next){
 93                 if(i&1) continue;
 94                 int v=edge[i].v-n;
 95                 ans[u][v]+=edge[i^1].cap;
 96             }
 97         }
 98         if(cse!=1) putchar(‘\n‘);
 99         printf("Matrix %d\n",cse);
100         for(int i=1; i<=n; ++i){
101             for(int j=1; j<=m; ++j){
102                 printf("%d ",ans[i][j]);
103             }
104             putchar(‘\n‘);
105         }
106     }
107     return 0;
108 }
时间: 2024-10-12 03:53:31

UVa11082 Matrix Decompressing(最小费用最大流)的相关文章

POj3422 Kaka&#39;s Matrix Travels 最小费用最大流 拆点

题目链接: poj3422 题意: 有一个N X N的矩阵, 矩阵的每一小格都有且仅有一个数字v,kaka每经过一个数字就会把它捡起来并将那个数字加到sum上去. 现在kaka能通过向下或向右走的方式从 (1,1)到(n,n)  K次,问kaka能取到的最大的sum是多少. 解题思路: 题目问题可以抽象为   求多次可走重复路的最长路的最大和问题 首先想到的就应该是最小费用最大流, 而题目要求的最大和值,那么应求就是最大费用最大流, 仅仅只需要将代码中的最小路算法改为最长路算法即可 题目的条件是

POJ 3422 Kaka&#39;s Matrix Travels 【最小费用最大流】

题意: 卡卡有一个矩阵,从左上角走到右下角,卡卡每次只能向右或者向下.矩阵里边都是不超过1000的正整数,卡卡走过的元素会变成0,问卡卡可以走k次,问卡卡最多能积累多少和. 思路: 最小费用最大流的题目. 建图自己没想出来,看了大神的建边,把每个点分解成两个点,一个代表进入一个代表出去,然后每个进入和每个出去连边,容量是1价值是这个点的矩阵的数值.然后因为可以不进去,所以起点要和别的矩阵元素的起点建边,终点也要和别的矩阵矩阵元素的起点建边,最后跑下最小费用最大流. 这题最右下角的矩阵元素需要特殊

POJ--3422--Kaka&#39;s Matrix Travels【最小费用最大流+拆点】

链接:http://poj.org/problem?id=3422 卡卡 题意:卡卡的矩阵之旅,有一个n*n的矩阵,卡卡要从左上角走到右下角,每次他只能往右或往下走,卡卡可以走k遍这个矩阵,每个点有一个num值,卡卡走到这里可以获得num点,一个点只能获得一次num值,问卡卡走完k遍后身上num值最大可以是多少? 思路:其实看到这题时没思路,图论书上说了建图的方式,但没有说为什么,我不解,网上搜了一下解题报告,百度了两页,我看到的博客都是写了如何建图,但没有写为什么要这么建..我觉得我真是弱渣,

POJ 3422Kaka&#39;s Matrix Travels(最小费用最大流)

Kaka's Matrix Travels Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9460   Accepted: 3844 Description On an N × N chessboard with a non-negative number in each grid, Kaka starts his matrix travels with SUM = 0. For each travel, Kaka mo

UVA11082 Matrix Decompressing 最大流建模解矩阵,经典

/** 题目:UVA11082 Matrix Decompressing 链接:https://vjudge.net/problem/UVA-11082 题意:lrj入门经典P374 已知一个矩阵的行数为r,列数为c,前i行的和ai(1<=i<=r),前j列的和bj(1<=j<=c). ai,bj都在[1,20]内.求出这个矩阵. 思路:通过前i行的和以及前j列的和,获得每一行的和以及每一列的和. 把每一行看做一个节点,每一列看做一个节点. 建立一个源点到达每一行. 建立一个汇点,

POJ 3422 Kaka&#39;s Matrix Travels (最小费用最大流)

POJ 3422 Kaka's Matrix Travels 链接:http://poj.org/problem?id=3422 题意:有一个N*N的方格,每个方格里面有一个数字.现在卡卡要从左上角走到右下角,规定每次只能向下或者向右走,每次走到一个格子,将得到该格子的数字,并且该格子的数字变为0.当卡卡走一次时,很容易求出最大值,问卡卡走k次,能够得到的最大值为多少. 思路:最小费用最大流 关键是如何构图 1. 将N*N个格点拆分为两个点(i,i + N*N),每个点之间连一条流量为1,费用为

hdu 2686 Matrix 最小费用最大流

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2686 Yifenfei very like play a number game in the n*n Matrix. A positive integer number is put in each area of the Matrix.Every time yifenfei should to do is that choose a detour which frome the top left

POJ 3686.The Windy&#39;s 最小费用最大流

The Windy's Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 5477   Accepted: 2285 Description The Windy's is a world famous toy factory that owns M top-class workshop to make toys. This year the manager receives N orders for toys. The ma

POJ 2516 Minimum Cost(最小费用最大流啊)

题目链接:http://poj.org/problem?id=2516 Description Dearboy, a goods victualer, now comes to a big problem, and he needs your help. In his sale area there are N shopkeepers (marked from 1 to N) which stocks goods from him.Dearboy has M supply places (mar