标签:its cas amp using print 存在 最小顶点覆盖 需要 scan
用来求 二分图最大匹配
并且 最小顶点覆盖==最大匹配
#include<bits/stdc++.h> using namespace std; int mp[105][105];//图 int used[106];//记录循环每次使用情况 int vis[105];//记录的是匹配情况 int n,m;//n为左图 m为右图 bool dfs(int x) { for(int j=0;j<m;j++) { if(mp[x][j]&&!used[j]) { used[j]=1; if(!vis[j]||dfs(vis[j])) { vis[j]=x; return true; } } } return false; } int main() { int k,cas,x,y; while(scanf("%d",&n),n) { memset(mp,0,sizeof(mp)); memset(vis,0,sizeof(vis)); for(int i=0;i<n;i++) { memset(used,0,sizeof(used));//每次的使用 需要清除 if(dfs(i))ans++; } printf("%d\n",ans); } }
概念:
最大匹配:二分图中边集的数目最大的那个匹配;
最小顶点覆盖:用最少的点,让每条边都至少和其中一个点关联;
最小边覆盖:用尽量少的不相交简单路径覆盖有向无环图(DAG)G的所有顶点;
最大独立集:在N个点的图G中选出m个点,使这m个点两两之间没有边的点中,m的最大值。
(a)、对于不存在孤立点的图,最大匹配+最小边覆盖=顶点数;
(b)、最大独立集+最小顶点覆盖=顶点数;
二分图中:
(c)、最大匹配=最小顶点覆盖。
标签:its cas amp using print 存在 最小顶点覆盖 需要 scan
原文地址:https://www.cnblogs.com/bxd123/p/10361608.html