博客
关于我
hdu 1151 Air Raid DAG最小边覆盖 最大二分匹配
阅读量:454 次
发布时间:2019-03-06

本文共 1136 字,大约阅读时间需要 3 分钟。

最小边覆盖问题可以通过将有向无环图(DAG)转化为二分图来解决。具体步骤如下:

  • 转化问题:将DAG的顶点分为两部分,构建二分图,其中原图的每个顶点对应两个虚点,分别属于二分图的两部分。

  • 建立匹配:在二分图中寻找最大匹配。由于原图是DAG,不存在环,因此二分匹配中也不会出现环。

  • 计算覆盖数:最小边覆盖数目等于顶点数减去最大二分匹配数目。

  • 以下是详细的解决步骤:

    • 转换DAG为二分图:将DAG的顶点分为两部分,构建边连接对应的虚点。
    • 寻找最大二分匹配:使用DFS算法计算最大匹配数目。
    • 计算最小边覆盖数目:用顶点总数减去最大匹配数目,得到最小边覆盖数目。

    通过以上方法,可以高效地解决问题。以下代码实现了这一思路:

    #include 
    #include
    int g[125][125], vis[125], who[125];int n;bool find(int x) { for(int i = 1; i <= n; ++i) { if(g[x][i] && !vis[i]) { vis[i] = 1; if(!who[i] || find(who[i])) { who[i] = x; return true; } } } return false;}int main() { int t; scanf("%d", &t); while(t--) { memset(g, 0, sizeof(g)); memset(who, 0, sizeof(who)); int m, u, v; scanf("%d", &n); scanf("%d", &m); while(m--) { scanf("%d %d", &u, &v); g[u][v] = 1; } int sum = 0; for(int i = 1; i <= n; ++i) { memset(vis, 0, sizeof(vis)); if(find(i)) sum++; } printf("%d\n", n - sum); } return 0;}

    通过上述代码,可以计算出DAG的最小边覆盖数目,解决问题。

    转载地址:http://hljyz.baihongyu.com/

    你可能感兴趣的文章
    OpenCV学习(13) 细化算法(1)(转)
    查看>>
    OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波
    查看>>
    OpenCV学堂 | OpenCV案例 | 基于轮廓分析对象提取
    查看>>
    OpenCV官方文档 理解k - means聚类
    查看>>
    OpenCV探索
    查看>>
    OpenCV环境搭建(一)
    查看>>
    openCV目标识别 目标跟踪 YOLO5深度学习 Python 计算机视觉 计算机毕业设计 源码下载
    查看>>
    opencv笔记(1):图像缩放
    查看>>
    opencv笔记(二十四)——得到轮廓之后找到凸包convex hull
    查看>>
    OpenCV计算点到直线的距离 数学法
    查看>>
    Opencv识别图中人脸
    查看>>
    OpenCV读写avi、mpeg文件
    查看>>
    opencv面向对象设计初探
    查看>>
    OpenCV(1)读写图像
    查看>>
    OpenCV:不规则形状区域中每种颜色的像素数?
    查看>>
    OpenCV:概念、历史、应用场景示例、核心模块、安装配置
    查看>>
    OpenDaylight融合OpenStack架构分析
    查看>>
    openEuler Summit 2022 成功举行,开启全场景创新新时代
    查看>>
    openEuler 正式开放:推动计算多样化时代的到来
    查看>>
    OpenEuler23.03欧拉系统_安装瀚高数据库企业版6.0.4_踩坑_安装以后系统无法联网_启动ens33网卡---国产瀚高数据库工作笔记002
    查看>>