其实还可以用存边,只需要在以下代码中修改一点点(可是我不会→_→)
//map[i][j] 存图
//road[i] 标记i点是否是未盖点
//link[i] 记录增广路上与i相连的前一个点,即已求出的匹配
bool Find(int v){//查找从v点出发是否有增广路
for(int i=1;i<=n;i++){//n为上层节点数
if(map[v][i] && (!road[i])){//v.i之间有边 并且 i不在增广路上
road[i]=true;//标记i 防止死循环
if(link[i] || Find(link[i])){//i是未盖点 或者 从i的匹配点出发能寻找到增广路
link[i]=v;//(重新)标记i的匹配点
return true;
}
}
}
return false;
}
//main()中
for(int i=1;i<=n;i++){
memset(road,0,sizeof(road));//全部标记为未盖点
if(Find(i))tot++;//tot为最大匹配数
}