首页 > 其他分享 >HDU1151—Air Raid(最小路径覆盖)

HDU1151—Air Raid(最小路径覆盖)

时间:2023-07-31 14:14:13浏览次数:44  
标签:二分 Raid 覆盖 int 路径 最小 Air 图中 HDU1151

【\(HDU1151\)】—\(Air\) \(Raid\)(最小路径覆盖)

  • 题解描述
    给定一个\(DAG\)(有向无环图),选定最少的点,使得从这些点出发可以覆盖每一条路径(即每个点都经过至少一遍)。

输入

2
4
3
3 4
1 3
2 3
3
3
1 3
1 2
2 3

输出

2
1

以测试数据为例,\(4\)个路口,\(3\)条路。现派伞兵经过所有路口,求最少要派几名。

思路

首先构建二分图,图的左边代表\(1-n\),右边也代表\(1'-n'\),若两点\(i->j'\)可行,则二分图中建边\(i->j'\),求最少路径覆盖即为求最大独立集,也就是\(n-\)最大匹配数。

解释:
在二分图中,最小路径覆盖和最大独立集是等价的。
二分图是指一个图的顶点可以分为两个不相交的集合,并且图中的每条边都连接一个集合中的顶点和另一个集合中的顶点。
在二分图中,最小路径覆盖的解可以直接对应到最大独立集的解,反之亦然。具体来说,对于二分图中的最小路径覆盖问题,我们可以将其转化为最大独立集问题求解。而对于二分图中的最大独立集问题,我们也可以将其转化为最小路径覆盖问题求解。
这个等价关系的原因是,二分图的最大独立集正好对应着最小路径覆盖中选择的路径的起点和终点集合。因为在二分图中,任意两个相邻的顶点之间都没有边相连,所以选择一个顶点就意味着不选择与之相邻的顶点。

结论:二分图中最少路径覆盖即为最大独立集

#include <bits/stdc++.h>
using namespace std;
const int N = 1e3 + 5;
/*
测试用例:
2
4
3
3 4
1 3
2 3
3
3
1 3
1 2
2 3

答案:
2
1
*/
int match[N];
int st[N], g[N][N];
int n, m;

int dfs(int x) {
    for (int i = 1; i <= n; i++) {
        if (g[x][i] && !st[i]) {
            st[i] = 1;
            int t = match[i];
            if (t == -1 || dfs(t)) {
                match[i] = x;
                return 1;
            }
        }
    }
    return 0;
}

int main() {
    int T;
    cin >> T; // T组测试数据
    while (T--) {
        cin >> n >> m; // n个节点,m条边
        // 多组测试数据
        memset(match, -1, sizeof match);
        memset(g, 0, sizeof g);

        for (int i = 0; i < m; i++) {
            int a, b;
            cin >> a >> b;
            g[a][b] = 1; // a->b,有向图
        }

        // 如果a->b,b->c,则 a->c,题意中说如果存在传递关系,需要我们建立关系清晰的边,也就是,
        // 用 floyd,在O(N^3)的复杂度下完善点点之间的边关系
        for (int k = 1; k <= n; k++)
            for (int i = 1; i <= n; i++)
                for (int j = 1; j <= n; j++)
                    g[i][j] |= g[i][k] & g[k][j];

        // 新图建成,开始跑匈牙利算法,求二分图的最大匹配
        int cnt = 0;
        for (int i = 1; i <= n; i++) {
            memset(st, 0, sizeof st);
            if (dfs(i)) cnt++;
        }
        // 二分图的最小点覆盖 = n- 二分图的最大匹配
        printf("%d\n", n - cnt);
    }
    return 0;
}

标签:二分,Raid,覆盖,int,路径,最小,Air,图中,HDU1151
From: https://www.cnblogs.com/littlehb/p/17593267.html

相关文章

  • Linux之RAID(独立硬盘冗余阵列)
    目录RAID(独立硬盘冗余阵列)1.RAID1.1RAID0磁盘阵列介绍11.2RAID1磁盘阵列介绍21.3RAID5磁盘阵列介绍31.4RAID1+0磁盘阵列介绍4RAID(独立硬盘冗余阵列)1.RAID一个磁盘达不到性能提升,将多块磁盘组成阵列(磁盘组),达到提升硬盘性能的效果raid级别:磁盘的组合方式,组合方......
  • AIRIOT可视化组态引擎如何应用于物联业务场景中
    在物联网的业务应用场景中,可视化组态是一个必不可少的功能需求。不同的行业场景,都需要将物联设备采集的数据和业务场景状态进行直观的可视化展示,供使用者进行分析或决策。如工艺流程用能监测、3D场景构建、能耗趋势场景报警联动、重点设备视频接入、重点数据移动监测、计划用能终......
  • [ABC308G] Minimum Xor Pair Query 题解
    MinimumXorPairQuery题目大意维护一个序列,支持动态插入,删除,查询最小异或对。思路分析看到查询最小异或对首先想到01Trie,但01Trie不支持删除,考虑暴力套一个线段树分治。需要预处理出每个元素的存活区间,这里使用了map<int,vector<int>>。注意,有的元素会存活到最后,需要特......
  • The Rising Importance of Automotive Diagnostic Tools in the Repair Industry
    TheRisingImportanceofAutomotiveDiagnosticToolsintheRepairIndustryIntheever-evolvingautomotiveworld,continuousadvancementsintechnologyhavebroughtmajorchangestothewayvehiclesarediagnosedandrepaired.Automotivediagnostictools......
  • Airflow使用入门指南
    Airflow能做什么Airflow是一个工作流分配管理系统,通过有向非循环图的方式管理任务流程,设置任务依赖关系和时间调度。Airflow独立于我们要运行的任务,只需要把任务的名字和运行方式提供给Airflow作为一个task就可以。安装和使用最简单安装在Linux终端运行如下命令(需要已安装好pytho......
  • [ABC308G]MinimumXorPairQuery
    [ABC308G]MinimumXorPairQuery必须知道的性质:对于三个非负整数\(x,y,z(x<y<z)\),有\(\min(x\bigoplusy,y\bigoplusz)<x\bigoplusz\)。证明从二进制最高位开始\(i=\logV\),对\(x,y,z\)进行如下操作:若它们的当前位都两两相同,继续跳到下一位i--。根据......
  • Linux之RAID
    目录独立硬盘冗余阵列(RAID,RedundantArrayofIndependentDisks),旧称廉价磁盘冗余阵列(RedundantArrayofInexpensiveDisks),简称磁盘阵列。......
  • 【更新公告】Airtest更新至1.3.0.1版本
    1.前言本次更新为Airtest库更新,版本提升至1.3.0.1版本,主要新增了一些iOS设备相关的装包等接口,以及封装了一些tidevice常用接口。更多更新详情,详见我们下文的描述。2.新增iOS设备接口1)iOS安装接口:install、install_app对于本地USB连接的iOS设备,新版本支持装包功能:#可以直......
  • AirNet使用笔记8
    摘要:SDD显示多监视源航迹;1、SDD同时显示多监视源航迹,在“DataSource”选择。.sdd_offline.conf.0不加点不是隐藏文件也行。[root@ACC-3conf]#more/home/cdatc/AirNet/bin/conf/.sdd_offline.conf.0B_OPS_IS_MAINTAIN=1......
  • 113.STL中的pair
    113.STL中的pair1.pair的简介pair是C++STL(标准模板库)中的一个现有容器,它将2个数据整合成一组数据,当我们类似需求的时候就可以使用到pair啦!pair其实有点像Python中字典中的键值对(Key-Value),一个Key对应着一个Value。pair的本质其实就是个结构体,它含有两个成员变量first和second。......