二分图——最大不可互相到达数 = 最小路径覆盖数

study from:

https://blog.csdn.net/winter2121/article/details/79849472

https://nanti.jisuanke.com/t/19979

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <cmath>
 4 #include <cstring>
 5 #include <time.h>
 6 #include <string>
 7 #include <set>
 8 #include <map>
 9 #include <list>
10 #include <stack>
11 #include <queue>
12 #include <vector>
13 #include <bitset>
14 #include <ext/rope>
15 #include <algorithm>
16 #include <iostream>
17 using namespace std;
18 #define ll long long
19 #define minv 1e-6
20 #define inf 1e9
21 #define pi 3.1415926536
22 #define nl 2.7182818284
23 const ll mod=1e9+7;//998244353
24 const int maxn=1e2+10;
25
26 bool vis[maxn];
27 int cony[maxn],r[maxn][maxn],n;
28
29 bool dfs(int x)
30 {
31     int y;
32     for (y=1;y<=n;y++)
33         if (!vis[y] && r[x][y])
34         {
35             vis[y]=1;
36             if (cony[y]==0 || dfs(cony[y]))
37             {
38                 cony[y]=x;
39                 return 1;
40             }
41         }
42     return 0;
43 }
44
45 int main()
46 {
47     int sum,t,m,i,j,k,x,y;
48     scanf("%d",&t);
49     while (t--)
50     {
51         scanf("%d%d",&n,&m);
52         memset(r,0,sizeof(r));
53         for (i=1;i<=m;i++)
54         {
55             scanf("%d%d",&x,&y);
56             r[x][y]=1;
57         }
58
59         for (k=1;k<=n;k++)
60             for (i=1;i<=n;i++)
61                 for (j=1;j<=n;j++)
62                     r[i][j]|=r[i][k]&r[k][j];
63
64         sum=n;
65         memset(cony,0,sizeof(cony));
66         for (i=1;i<=n;i++)
67         {
68             memset(vis,0,sizeof(vis));
69             sum-=dfs(i);
70         }
71         printf("%d\n",sum);
72     }
73     return 0;
74 }

另外:(copy from other)

最大匹配数:最大匹配的匹配边的数目

最小点覆盖数:选取最少的点,使任意一条边至少有一个端点被选择

最大独立数(最大团):选取最多的点,使任意所选两点均不相连

最小路径覆盖数:对于一个 DAG(有向无环图),选取最少条路径,使得每个顶点属于且仅属于一条路径。路径长可以为 0(即单个点)。

定理1:最大匹配数 = 最小点覆盖数(这是 Konig 定理)

定理2:最大匹配数 = 最大独立数

定理3:最小路径覆盖数 = 顶点数 - 最大匹配数

原文地址:https://www.cnblogs.com/cmyg/p/9556284.html

时间: 2024-11-02 15:49:48

二分图——最大不可互相到达数 = 最小路径覆盖数的相关文章

POJ - 1422 Air Raid(DAG的最小路径覆盖数)

1.一个有向无环图(DAG),M个点,K条有向边,求DAG的最小路径覆盖数 2.DAG的最小路径覆盖数=DAG图中的节点数-相应二分图中的最大匹配数 3. /* 顶点编号从0开始的 邻接矩阵(匈牙利算法) 二分图匹配(匈牙利算法的DFS实现)(邻接矩阵形式) 初始化:g[][]两边顶点的划分情况 建立g[i][j]表示i->j的有向边就可以了,是左边向右边的匹配 g没有边相连则初始化为0 uN是匹配左边的顶点数,vN是匹配右边的顶点数 左边是X集,右边是Y集 调用:res=hungary();输

Ural 1109 Conference(最小路径覆盖数)

题意:A国家有M个代表,B国有N个代表,其中有K对代表可以进行谈判(一个是A国的,一个是B国的),并且每一个代表至少被包含在其中一对中(也就是说,每个人可以至少找到另外一个人谈判),每一对谈判需要一对电话联系(一对电话联系数目算1),现在使每个人都能进行电话联系的最少联系数目 思路:既然是求最少的联系数目,也就是找最少的对数.可以先找到最大二分匹配(此时的匹配全都不重复,都是一对一的),然后加上剩下未匹配的人得数目即可(因为每个人肯定至少找到另外一个人进行谈判) n:A国代表人数 m:B国代表人

POJ 3020:Antenna Placement(无向二分图的最小路径覆盖)

Antenna Placement Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6334   Accepted: 3125 Description The Global Aerial Research Centre has been allotted the task of building the fifth generation of mobile phone nets in Sweden. The most st

二分图最大匹配,最小路径覆盖,最小点覆盖,最大独立集,最小边覆盖与建图方法

转载请注明出处(别管写的好坏,码字也不容易):http://blog.csdn.net/hitwhacmer1 前言:         有自己写的,有摘的别人的,前面是摘的,也是无心整理,出错是难免的,反正我都不会证明,智人见智,别被我误导了. §1图论点.边集和二分图的相关概念和性质 点覆盖.最小点覆盖 点覆盖集即一个点集,使得所有边至少有一个端点在集合里.或者说是"点" 覆盖了所有"边"..极小点覆盖(minimal vertex covering):本身为点覆

POJ 3020-Antenna Placement(二分图匹配_最小路径覆盖+前向星构图)

Antenna Placement Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6930   Accepted: 3439 Description The Global Aerial Research Centre has been allotted the task of building the fifth generation of mobile phone nets in Sweden. The most st

HDU 3861 The King’s Problem 最小路径覆盖(强连通分量缩点+二分图最大匹配)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3861 最小路径覆盖的一篇博客:https://blog.csdn.net/qq_39627843/article/details/82012572 题意: 把城市至少分成几个块,规则有三 1. A能B,B能到A,那么A,B一定要在一起. 2. 一个城市只能属于一个块. (说明了是最小不相交覆盖)3. 在一个块里的城市,任意2点之间必须有路径. 对于规则1,就是说强连通的必须在一起,所以用Tarjan

hdu3861 强连通+最小路径覆盖

题意:有 n 个点,m 条边的有向图,需要将这些点分成多个块,要求:如果两点之间有路径能够互相到达,那么这两个点必须分在同一块:在同一块内的任意两点相互之间至少要有一条路径到达,即 u 到达 v 或 v 到达 u:每个点都只能存在于单独一个块内.问最少需要划分多少块. 首先,对于如果两点之间能够相互到达则必须在同一块,其实也就是在同一个强连通分量中的点必须在同一块中,所以首先就是强连通缩点.然后在同一块内的任意两点之间要有一条路,那么其实就是对于一块内的强连通分量,至少要有一条路径贯穿所有分量.

有向无环图(DAG)的最小路径覆盖

DAG的最小路径覆盖 定义:在一个有向图中,找出最少的路径,使得这些路径经过了所有的点. 最小路径覆盖分为最小不相交路径覆盖和最小可相交路径覆盖. 最小不相交路径覆盖:每一条路径经过的顶点各不相同.如图,其最小路径覆盖数为3.即1->3>4,2,5. 最小可相交路径覆盖:每一条路径经过的顶点可以相同.如果其最小路径覆盖数为2.即1->3->4,2->3>5. 特别的,每个点自己也可以称为是路径覆盖,只不过路径的长度是0. DAG的最小不相交路径覆盖 算法:把原图的每个点

hdu1151+poj2594(最小路径覆盖)

传送门:hdu1151 Air Raid 题意:在一个城镇,有m个路口,和n条路,这些路都是单向的,而且路不会形成环,现在要弄一些伞兵去巡查这个城镇,伞兵只能沿着路的方向走,问最少需要多少伞兵才能把所有的路口搜一遍. 分析:有向无环图不相交最小路径覆盖数,等于节点数减去二分图的最大匹配数,对于每条弧,弧头作为X部,弧尾作为Y部.最后在求得最大匹配的基础上,没有被匹配的Y部的点就是简单路径的起点.其个数刚好就是节点数减去二分图的最大匹配数. #include <cstdio> #include