2018年2月2日训练日记

今晚两场比赛,希望不要再掉分了啊...

图论-网络流:目前看了80来道题,也感觉懂了不少东西,然而有的题目还是不会建模。。。还是看的少了吧。

好题:UVA 11082 Matrix Decompressing 最大流

题目大意:对于一个R行C列的正整数矩阵(1<=R,C<=20),设Ai和前i行所有元素之和,Bi为前i列所有元素之和。已知道R,C和数组A和B,找一个满足条件的矩阵。矩阵中的元素必须是1到20之间的正整数。输入保证有解。

一个大佬的博客写的非常好:假设这个矩阵的每一行是水管,每一列是水管,每行有出水口流到每一列,这样想比较好理解。然后每行的流量和每列的流量知道,就可以建图了。
建图过程,每行对应一个点,每列对应1个点,每行都可以流到每列,所以他们之间有边。我们得假设他们是如何流向的,不如设从行流向列,那么添加源点,流向每行;添加汇点,被每列汇流。容量怎么设?我们要让每行都满流就行了,那么行之和就是源点到该行的容量,同理汇点也如此。但是每行流向每列呢?注意每个格子的元素必须在1~20之间,所以把容量设为20,别让它流太多了。
注意到元素必须在1~20之间!!!那么这样增广路的话会出现有的完全0流怎么办?先将每个格子中的元素自减1,它的流下限总不会为负吧,计算完输出时再加回去不就行了。

好题:UVA 1659 Help Little Laura 最大费用循环流

模型:给出一张有向图,从中选出权和最大的边集,组成若干个有向圈。

要求的就是最大费用循环流(即每找到一个环就可以进行增广)。找环可能并不复杂,但是要找一个最大的环就有点复杂了,所以用网络流解决。又因为找的是最大费用,按老套路的话会出现无限增大费用的情况,所以要先将每条边的费用取相反数(前面加个负),才可以有机会求最小费用流。而这些边的权有正有负,取完之后也可能出现负环了,所以主要问题就是解决负环。
  用最小费用流求最大费用循环流时,解决负环的一种方法:
(1)先将所有边权取反。
(2)建边。正权值的边容量为1,费用为权值。负权值的边u->v拆成3条边,分别是S->v,v->u,u->T,容量都为1,v->u费用为负权的相反数,其他2条费用为0。这样会出现某个点有多条边连到S或T,可以互相抵消到一方为0为止,统计剩下多少条k,将其中1条的容量设为k,其他的全部删掉。如果全部抵消掉了,那就将连S和T的边全部删掉。(这个删边的方法有技巧)
(3)跑一次最小费用流得到的总费用,加上所有负权之和之后(注:此时答案已为负的),再取反即得到最大费用。
删边技巧是,在建这S->v,v->u,u->T 三条边时,先建中间那条,统计该点连到S几次,减去连到T点几次,结果若为正,则与S连一条边,容量就是几次,若负,同理。(by  xcw0754)

核心代码:(by poursoul)

for (int i = 1; i <= N; ++ i) {  
        for (int j = 1; j <= N; ++ j) {  
            if (G[i][j]) {  
                porfit[i][j] = Y - dist (i, j) * X; //本题的边权是dist (i, j) * X - Y ,最大费用要取反
                if (porfit[i][j] > 0) {  
                    addedge (i, j, 1, porfit[i][j]);  
                }  
                else {  
                    addedge (j, i, 1, -porfit[i][j]);  
                    //deg[] < 0:出度小于入度,deg[] > 0:出度大于入度  
                    ++deg[j];  
                    --deg[i];  
                    sum += porfit[i][j];  
                }  
            }  
        }  
    }  
    for (int i = 1; i <= N; ++ i) {  
        if (deg[i] > 0) addedge (s, i,  deg[i], 0);  
        if (deg[i] < 0) addedge (i, t,  -deg[i], 0);  
    }  
    printf ("%.2f\n", -(MCMF () + sum) + eps);
晚上打了一场Wannafly挑战赛,rk72(话说小伙伴手速真是快,rk50+)还是只做了两道签到题。。。B题貌似kmp优化,我用的AC自动机超时,D题数学题,读不懂题。。。EF就不说了。。。还要继续努力。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值