gym100753 - B Bounty Hunter II

题目链接

DAG最小路径覆盖裸题

包括两类

  • 最小不相交路径覆盖:任意两路径不相交.
  • 最小可相交路径覆盖:

对于不相交问题, 转换为二分图匹配: 将每个点拆成Ax,Ay两个点, 如果有A->B的边,就在二分图中加边Ax->By容量为1
最后最小路径覆盖为(结点数-匹配数).

证明: 如果两点匹配,那么这两个点可缩略成一个点, 最后的匹配数就是减少的结点数, 对于一个结点需要一条路径覆盖
 因此最大匹配就能满足最小路径覆盖.

这里解二分图最大匹配使用dinic,模板见:Dinic.

int n, k, to;
// 源点为0, Ax为[1, n], Ay为[n + 1, 2 * n], 汇点为2 * n + 1 
void solve() {
    cin >> n;
    F.init(2 * n + 1);
    for (int i = 1; i <= n; i++) {
        cin >> k;
        for (int j = 1; j <= k; j++) {
            cin >> to;
            to++;
            F.add(i, to + n, 1);
        }
        F.add(0, i, 1);
        F.add(i + n, 2 * n + 1, 1);
    }
    int res = F.run(0, 2 * n + 1);
    cout << n - res << endl;
}
posted @ 2021-03-22 13:04  naymi  阅读(29)  评论(0)    收藏  举报