题意:给出一个矩阵 , 每个点代表青草或者泥泞的路 , 问你最少要多少块木板(宽度为一个点的宽度 , 长度任意)才能把这些泥泞的路都盖住 , 并且不能把草盖住 , 木板可以重合 。
这题要是没加(不能把草盖住)这个条件 , 那么就是普通的最小路径覆盖 。
然而加了这个题之后 , 还是用最小路径覆盖 , 只不过要重新建过图。
最小路径覆盖 = 原图节点数 - 建图后的最大匹配 。
建图:分两步 , 1、从行开始 , 对么个点就行编号 , 如果在同一行并且相邻 , 那么就标记为一个编号 。
2、从列开始 , 做法和1一样 , 行跟列是分别单独进行的 。
之后把行构成的点 , 看成是X点集合 , 列看成是Y点集合 , 再根据原图每个点的行跟列进行连接 , 就可以够成一个二分图 。
最近就只要用最下路径覆盖就能求出了 。
代码:
这题要是没加(不能把草盖住)这个条件 , 那么就是普通的最小路径覆盖 。
然而加了这个题之后 , 还是用最小路径覆盖 , 只不过要重新建过图。
最小路径覆盖 = 原图节点数 - 建图后的最大匹配 。
建图:分两步 , 1、从行开始 , 对么个点就行编号 , 如果在同一行并且相邻 , 那么就标记为一个编号 。
之后把行构成的点 , 看成是X点集合 , 列看成是Y点集合 , 再根据原图每个点的行跟列进行连接 , 就可以够成一个二分图 。
最近就只要用最下路径覆盖就能求出了 。
代码:
#include #include #include #include #include #include using namespace std; const int MAXN = 120; int n , m , vectorgrap[2500]; bool s[2500]; int x , y; void init() { } bool can(int u) { } int km() { } int main() { } |