2018年2月28日训练日记

昨晚趁着精神好看资料到三点多,中间发现一道水题就交了一发,居然还submit failed。。。二分图最大匹配最优匹配会了之后感觉很简单,最难的地方还是建图。今天醒来又交了一遍WA,找了半天发现这道题可能有重边。。。(已经在重边这里错了若干次了)

E题swap就是一个二分图最大匹配,可是我怎么都过不了样例,郁闷了我两三天,后来才发现输出任意答案都行,而且根据矩阵性质,如果行交换不能达到条件的话,列交换或行列交换也不可能达到条件。并且它这个交换还是一步交换,即某两行交换完了就不可以再交换。这道题还是有必要写一下题解的。。。(好不容易整出思路,一个小细节错了又害我找了半天)

今天看一般图匹配带花树二分图多重匹配

貌似二分图多重匹配可以用网络流做。。。赶紧去复习了一下网络流

感觉网络流还是写起来比较麻烦。。。而且为了熟悉二分图多重匹配,就不用网络流做了,以后用网络流再做一遍

先学习完网络流以后,建图就比较好想了。。。于是先去做专题里的题,题目用到二分或floyed也跟网络流里的差不多。。。

专题里三道二分图多重匹配题都用到了二分,也是比较经典的二分,有一道还用到了floyed。

需要注意几点:

1、n和m不能搞混 否则就 WA RE

2、注意初始化 数组及时清零 注意编号 注意是否有重边

3、题意一定要弄清楚,n,m,k都是什么含义,否则我就不说了,都懂

4、用floyed求最短路时一定要把距离0置为inf,因为0会干扰求最短路

5、二分图多重匹配题目用网络流也可以做,不过实现起来比较麻烦,但是两种方式大同小异

贴上poj 2112 Optimal Milking (floyed + 二分图多重匹配/网络流 + 二分)的个人代码:

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
const int maxn=610;
const int maxm=610;
const int inf=1e9;
const int mo=1e9+7;
int n,m,lk[maxn][maxm],ans,k;
int g[maxm][maxn],num[maxm];
int c[maxn][maxm];
bool jd[maxn][maxm],us[maxm];
bool dfs(int u)
{
   for(int v=1;v<=n;v++)
        if(jd[u][v]&&!us[v])
        {
            us[v]=1;
            if(g[v][0]>1);
         if(jud(mid)) {r=mid-1;}
         else l=mid+1;
        }
        printf("%d\n",l);
    }
    return 0;
}

你可能感兴趣的:(数据结构:二分查找,总结:训练日记,图论:图论基础,图论:二分图,ACM,二分图多重匹配)