• HDU1151 Air Raid 最小简单路径覆盖


    对于一个有向无环图,其最小简单路径覆盖就是等于节点数减去二分图的最大匹配数,对于每条弧,弧头作为X部,弧尾作为Y部。最后在求得最大匹配的基础上,没有被匹配的Y部的点就是简单路径的起点。其个数刚好就是节点数减去二分图的最大匹配数。证明略。

    代码如下:

    #include <cstring>
    #include <cstdlib>
    #include <cstdio>
    #define MAXN 125
    using namespace std;

    int N, M, G[MAXN][MAXN], marry[MAXN], visit[MAXN];

    int path(int u)
    {
    for (int i = 1; i <= N; ++i) {
    if (!G[u][i] || visit[i]) {
    continue;
    }
    visit[i] = 1;
    if (!marry[i] || path(marry[i])) {
    marry[i] = u;
    return 1;
    }
    }
    return 0;
    }

    int main()
    {
    int T, x, y, ans;
    scanf("%d", &T);
    while (T--) {
    ans = 0;
    memset(G, 0, sizeof (G));
    memset(marry, 0, sizeof (marry));
    scanf("%d %d", &N, &M);
    for (int i = 0; i < M; ++i) {
    scanf("%d %d", &x, &y);
    G[x][y] = 1;
    }
    for (int i = 1; i <= N; ++i) {
    memset(visit, 0, sizeof (visit));
    if (path(i))
    ++ans;
    }
    printf("%d\n", N-ans);
    }
    return 0;
    }



  • 相关阅读:
    junit4的初级用法
    junit3和junit4的区别总结
    工作一年多了,我的技术博客终于开通了
    VC++ 运行库官方安装包
    文本编辑器通用快捷键
    gcc命令介绍
    MinGW安装与配置
    windows常见快捷键
    Notepad++配置C/C++
    Notepad++快捷键
  • 原文地址:https://www.cnblogs.com/Lyush/p/2422360.html
Copyright © 2020-2023  润新知