模板
dfs:
bool dfs(int k){
for(int i=1;i<=n;i++){
if(!v[i] && map[k][i]){
v[i]=1;
if(link[i]=-1 || dfs(i)){
link[i]=k;
return 1;
}
}
}
return 0;
}
主函数:
int main(){
write something//输入变量n,并连边
memset(link,-1,sizeof(link));
for(int i=1;i<=n;i++){
memset(v,0,sizeof(v));
num+=dfs(i);
}
printf("%d",num);
}
定义与定理
最大匹配数:最大匹配的匹配边的数目
最小点覆盖数:选取最少的点,使任意一条边至少有一个端点被选择
最大独立数:选取最多的点,使任意所选两点均不相连
最小路径覆盖数:对于一个 DAG(有向无环图),选取最少条路径,使得每个顶点属于且仅属于一条路径。路径长可以为 0(即单个点)。
最大匹配数 = 最小点覆盖数(这是 Konig 定理)
最大匹配数 = 最大独立数
最小路径覆盖数 = 顶点数 - 最大匹配数