很经典的一道题目,做了好几遍,每次都很好地回顾了匈牙利算法。
解决无向图边覆盖问题的步骤如下:
1.拆点;
2.求拆点后图的最小点覆盖,即最大匹配数;
3.使用公式:最小路径覆盖=拆点前点的数量-最大匹配数/2。
回顾一下匈牙利算法的解题过程:
for(int i=1;i<=xNum;i++){
for(int j=1;j<=yNum;j++){
ifVisited[j]=false''
}
if(dfs(i)==true){
number++;
}
}
bool dfs(int i){
for(int j=1;j<=yNum;j++){
if(ifVisited[j]==false&&grid[i][j]==true){
ifVisited[j]==true;
if(ancestor[j]==0||dfs(ancestor[j])==true){
ancestor[j]=i;
return true;
}
}
}
return false;
}
其中,number为最大匹配数,ancestor为某个y点所链接的前驱x点。
本题实际上就是解无向图边覆盖问题,每个基站是一个点,每个保护罩是连接两个点的一条线
#include<iostream>
using namespace std;
int case